对象的内存布局与指针压缩

我们知道在Java中基本数据类型的大小

例如int类型占4个字节、long类型占8个字节

那么Integer对象和Long对象会占用多少内存呢

 

1--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

32位系统

64位系统

64位开启指针压缩的情况下

若为数组对象

MarkWord标记位

4字节

8字节

8字节

 

Class Pointer

4字节

8字节

4字节

 

Length

 

 

 

4字节

        32位系统 对象头占用空间= 4 + 4 = 8 byte

        64位系统 对象头占用空间= 8 + 8 =16 byte

        64位开启指针压缩 对象头占用空间= 4 + 8 = 12 byte

注:

        若为数组对象,对象头占用空间 + 4 byte

        静态属性不算在对象大小内

 

        Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数

        例如,一个包含两个属性的对象:intbyte,这个对象需要占用8+4+1=13个字节

        这时就需要加上大小为3字节的padding进行8字节对齐,最终占用大小为16个字节。

 

2--------------------------------------------------------------------------------------------------------------------------------------------------------------------

        从上文的分析中可以看到,64JVM消耗的内存会比32位的要多大约1.5,这是因为对象指针在64JVM下有更宽的寻     址

        对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到

        从JDK 1.6 update14开始,64位的JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新        参数。JDK 1.8,默认该参数就是开启的。

       OOP的全称为:Ordinary Object Pointer,就是普通对象指针。启用CompressOops后,会压缩的对象

        每个Class的属性指针(静态成员变量);

        每个对象的属性指针;

        普通对象数组的每个元素指针

当然,压缩也不是所有的指针都会压缩,对一些特殊类型的指针,JVM是不会优化的,例如指向PermGen1.8废弃Class对象指针、本地变量、堆栈元素、入参、返回值和NULL指针不会被压缩。

 

算了,直接看他吧,他这篇文章灰常棒:http://www.ideabuffer.cn/2017/05/06/Java%E5%AF%B9%E8%B1%A1%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值