Java对象结构
2022-09-25 18:05:46 19 举报
Java对象结构
作者其他创作
大纲/内容
Java对象结构
用于存储自身运行时的数据,例如GC标志位、哈希码、锁状态等信息。核心作用:表示对象的线程锁状态、配合GC存放该对象的hashCodespan style=\
用于存放方法区Class对象的地址,虚拟机通过这个指针来确定这个对象是哪个类的实例。作用:是一个指向方法区中span style=\
对象体
对象体包含对象的实例变量(成员变量),用于成员属性值,包括父类的成员属性值。这部分内存按4字节对齐。作用:对象主体部分,保存对象属性值,占用的内存空间大小取决于对象的属性数量和类型
对象头
Mark Word(标记字)
Class Pointer(类对象指针)
jvm参数:+UseCompressedOops开启指针压缩,开启后对以下类型从64位压缩到32位:·Class对象的属性指针(静态变量)。·Object对象的属性指针(成员变量)。·普通对象数组的元素指针。一些特殊类型的指针不会压缩,比如指向PermGen(永久代)的Class对象指针(JDK 8中指向元空间的Class对象指针)、本地变量、堆栈元素、入参、返回值和NULL指针等。手动开启Oop对象指针压缩的Java指令为: java -XX:+UseCompressedOops mainclass手动关闭Oop对象指针压缩的Java指令为: java -XX:-UseCompressedOops mainclass
markword内部结构(64位)
对齐字节也叫作填充对齐,其作用是用来保证Java对象所占内存字节数为8的倍数。HotSpot VM的内存管理要求对象起始地址必须是8字节的整数倍。对象头本身是8的倍数,当对象的实例变量数据不是8的倍数时,便需要填充数据来保证8字节的对齐。作用:起占位符作用,对象实例数据部分没有对齐(8字节的整数倍)时,就需要通过对齐填充来补全。
属性1属性2...
如果对象是一个数组,那么对象头还需要有额外的空间用于存储数组的长度(Array Length字段)。Array Length字段的长度也随着JVM架构的不同而不同:在32位JVM上,长度为32位;在64位JVM上,长度为64位。64位JVM如果开启了Oop对象的指针压缩,Array Length字段的长度也将由64位压缩至32位。
Array Length(数组长度)
对齐字节
如果对象是一个Java数组,那么此字段必须有,用于记录数组长度的数据;如果对象不是一个Java数组,那么此字段不存在,所以这是一个可选字段。长度:32位
markword内部结构(32位)
0 条评论
下一页