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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容