面试
Q:Object obj = new Object(); 谈谈对这句话的理解?
位置所在:JVM-堆 —> 新生区 —> 伊甸园区
构成布局:头体(想想HTML报文)
1. 对象的内存布局:
对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)
2. 对象内存布局 - 对象头 - 对象标记
对象头 Mark Word
Q:对象头多大?
A:在64位系统中,Mark Word占了8个字节,类型指针占8个字节,一共16个字节。
3. 对象内存布局 - 对象头 - 类型指针
类型指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定对象是哪个类的实例。
4. 对象内存布局 - 实例数据、对齐填充
5. 64位标记图
6. 对象布局 - JOL证明
JOL : Java Object Layout
定位:分析对象在JVM的大小和分布
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
<scope>provided</scope>
</dependency>
7. 对象布局 - 对象分代年龄
对象分代年龄:4 bit
测试:配置jvm参数 -XX:MaxTenuringThreshold=16
无法启动:MaxTenuringThreshold of 16 is invalid; must be between 0 and 15
8. 压缩指针参数说明
命令:java -XX:+PrintCommandLineFlags -version
默认开启压缩说明
-XX:+UseCompressedClassPointers
1) 默认配置,启动了压缩指针,-XX:+UseCompressedClassPointers,
12 + 4(对象填充) = 16字节
2) 手动配置,关闭了压缩指针,-XX:-UseCompressedClassPointers,
8 + 8 = 一个对象16字节