JVM-2-java对象

问题

  • 怎么获取java对象大小
    • Instrumentation + javaagent
      • Instrumentation有个getObjectSize方法,直接计算shallow size
      • 不过Instrumentation无法直接获取,需要借助javaagent
    • Unsafe
      • 通过反射theUnsafe属性拿到Unsafe实例(构造方法私有,getUnsafe是个CallerSensitive)
      • 利用Unsafe实例拿到对象各个属性的offset,然后排序,拿到最大offset
      • offset + 该Field的大小,就是对象的shallow size(即未计算引用对象的实际大小)
  • 什么是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

你可能感兴趣的:(JVM-2-java对象)