Java对象内存布局
2022-06-30 21:52:53 0 举报
java对象的内幕才能布局可以分为三个部分,对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding)。
作者其他创作
大纲/内容
对齐填充(padding)
动态链接
方法区
Instance Data
Padding
Object对象
实例数据
堆空间
父类的实例数据
new Score实例
Mark Word
JVM启动默认开启了压缩指针 -XX: UseCompressedClassPointersJOL工具JOL全称为Java Object Layout,是用来分析JVM中对象布局的工具,可以在运行时计算某个对象的大小。官网: http://openjdk.java.net/projects/code-tools/jol/maven依赖:<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.10</version></dependency>
在64位系统中MarkWord占用8个字节,类型指针占用8个字节,一共16个字节
Array 对象
局部变量表
字符串常量池
id = 827722
...
张三
new Student实例
类型指针
name
score
虚拟机栈
对象内存布局
MarkWord 结构(64位)
header
length
hash值GC分代年龄锁状态标志.....
填充数据:由于虚拟机要求对象的起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了对齐字节。
对象的内部结构分为: 对象头、 实例数据、 对齐填充(保证8个字节的倍数)
JVM内存布局
操作数栈
运行时元数据
对象头中包含MarkWord标记字段,ClassPointer类型指针,GC所需的分代年龄,如果是数组对象还有length长度。类型指针是对象指向它类元信息的指针,虚拟机通过这个指针,来确定这个对象是哪个类的实例(指向方法区统一的多个实例对象的模板)。MarkWord用于存储对象自身的运行时数据。
Student的Klass类元信息
Score的Klass类元信息
是否偏向锁
锁标志位
锁状态
存储内容
0
01
无锁态(new)
对象的hashCode、分代年龄
1
偏向锁
当前线程指针、偏向时间戳、对象分代年龄
00
轻量级锁
指向线程栈中锁记录(lock Record)的指针
10
重量级锁(锁膨胀)
指向互斥量(重量级锁)的指针
11
GC标记
空,不需要记录信息
附加信息
方法返回地址
对象实例通过类型指针指向方法区它的类元信息,虚拟机通过这个指针来确定这个对象是哪个类的实例。Klass类元信息: 同一个对象的多个实例(例如多个Student实例)来源于方法区的类元信息(对象模板)
Array Data
Class Pointer类型指针
对齐填充Padding
student
. . .
对象头Header
Thread-1
实例数据:存放类的属性(Field)信息,包括父类的属性信息,这部分按4个字节对齐
对象头
实例数据Instance Data
0 条评论
下一页