2020-08-13

java对象占用大小

  • 对象的内存布局
    在这里插入图片描述

对象内存分为三部分,对象头实例数据对齐填充

1.对象头

  • Mark Word
    32位机,占4字节;64位机,占8字节。
    主要存储对象运行时的一部分数据: hashcode,GC 分代年龄,锁状态标志位,线程锁标记,偏向线程ID,偏向时间戳等
  • 类型指针(Klass point)
    指向方法区当前对象的Class类
    开启指针压缩:指针大小为4B;未开启指针压缩:指针大小位8B
  • 数组长度
    普通对象没有数组长度,数组对象才有数组长度
  • 对齐填充(上第二个图,特殊情况下会有,见下面数组对象的演示)
    数组对象在关闭指针压缩时,对象头会有填充

2.实例数据

3.对齐填充

JVM中所有对象大小都按8字节倍数对齐,填充的那部分就是填充

4.空对象大小

巩固上述内容,现在看一下空对象的大小
空对象:没有任何普通属性的类生成的对象
开启指针压缩 16B
=8B(Mark Word) + 4B(Klass point) + 0B(数组长度) + 0B(实例数据) + 4B(对齐填充)
未开启指针压缩 16B
=8B(Mark Word)  + 8B(Klass point) + 0B(数组长度) + 0B(实例数据) + 0B(对齐填充)

5.指针压缩(优化)

开启(默认)/关闭指针压缩 -XX:+/-UseCompressedOops

  • 目的
    通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。对于那些将要从32位平台移植到64位的应用来说,多了1/2的内存占用节省空间,提升jvm运行效率

  • 指针压缩效果对比(注意区分对象的内存组成)
    空对象
    在这里插入图片描述
    普通对象
    在这里插入图片描述
    数组对象
    在这里插入图片描述
    注意上例数组对象关闭指针压缩时,出现了两个alignment(对齐填充),为什么会有两个???

6.指针压缩实现原理

调优参数:-XX:+/-UseCompressedOops(默认开启指针压缩)
oop:普通对象指针(ordinary object pointer),注意不是OOP(面向对象)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值