Hotspot对象的内存布局

Posted mazhimazhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hotspot对象的内存布局相关的知识,希望对你有一定的参考价值。

 

对象头

class oopDesc 
 ...
private:
  volatile markOop _mark;
  union _metadata 
    Klass*      _klass;
    narrowKlass _compressed_klass;
   _metadata;
  ...

在hotspot中对象指针称为oop(ordinary object pointer),而oopDesc则是对象头的结构.。除了Klass(之所以叫klass是因为class是C++关键字)指针外,,还由一个_mark字段,,是因为除了对象的class信息以外,还有一些对象信息需要保留, 比如GC年龄, 锁状态等。
_klass是存在于union类型的_metadata中的,union类型的分配是按成员最大的那个进行分配的, 然后对这块内存的解释取决于代码中使用的是哪个字段。

typedef juint  narrowKlass; // typedef uint32_t juint;

typedef class markOopDesc* markOop;

对象头默认情况占16字节,在开启压缩对象指针时(通过-XX:+UseCompressedClassPointers),占12字节,默认状态是开启的. 

 

对象成员

  • long / double - 8 bytes
  • int / float - 4 bytes
  • short / char - 2 bytes
  • byte/boolean - 1 bytes
  • reference type - 4 or 8 bytes

heap小于32G时, 指针压缩默认开启.。JVM相应的控制参数为: -XX:+/-UseCompressedOops。

 

对象局部

 

 

与对象内存布局相关的命令如下:

(1)-XX:+UseCompressedClassPointers。

(2)-XX:+/-UseCompressedOops。

(3)-XX:PrintFieldLayout可查看对象的内存布局。

(4)-XX:FieldsAllocationStyle=mode, 默认mode是1。

(5)-XX:+/-CompactFields 由于填充会形成gap空洞, 比如使用压缩kclass指针时, 头占12字节, 后面如果是long的话, long的对齐要求是8字节, 中间会有4个字节的空洞, 为了高效利用, 可以把int/short/byte等比较小的对象塞进去, 与此同时JVM提供了开关控制该特性-XX:+/-CompactFields, 默认开启。

 

 

参考:

https://blog.csdn.net/lqp276/article/details/52190503

 

以上是关于Hotspot对象的内存布局的主要内容,如果未能解决你的问题,请参考以下文章

java对象内存布局

HotSpot 虚拟机对象探秘

深入理解java虚拟机HotSpot Java对象创建,内存布局以及訪问方式

java对象详解

对象的内存布局

JVM--对象的内存布局