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(面向对象)