问题
- 怎么获取java对象大小
- Instrumentation + javaagent
- Instrumentation有个getObjectSize方法,直接计算shallow size
- 不过Instrumentation无法直接获取,需要借助javaagent
- Unsafe
- 通过反射theUnsafe属性拿到Unsafe实例(构造方法私有,getUnsafe是个CallerSensitive)
- 利用Unsafe实例拿到对象各个属性的offset,然后排序,拿到最大offset
- offset + 该Field的大小,就是对象的shallow size(即未计算引用对象的实际大小)
- Instrumentation + javaagent
- 什么是javaagent
- 可以认为是虚拟机层面的拦截器
- premain -> main -> agentmain
结构大小
- 对象组成
- 对象头
- 普通对象头:Markword + Class Pointer
- 数组对象头:Markword + Class Pointer + Length
- 实例数据
- 对齐填充(Hotspot VM要求对象起始地址为8倍数)
- 对象头
- 对象头
- 普通对象头
- x32:4 + 4 bytes
- x64:8 + 8 bytes
- 数组对象头
- x32:4 + 4 + 4 bytes
- x64:8 + 8 + 4 bytes
- 普通对象头
- 指针压缩
- -XX:+UseCompressedOops
- 影响x64
- 对象头
- 普通对象头
- 8 + 4
- 数组对象头(不同于普通对象,标记字也被压缩了)
- 4 + 4 + 4
- 普通对象头