给大家推荐一个可以查看普通java对象的内部布局工具JOL(JAVA OBJECT LAYOUT),使用此工具可以查看new出来的一个java对象的内部布局,以及一个普通的java对象占用多少字节。
引入maven依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
</dependencies>
测试
package com.cctv;
import org.openjdk.jol.info.ClassLayout;
public class TestJOL {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
}
}
- 利用jol查看64位系统java对象(空对象),默认开启指针压缩,总大小显示16字节,前12字节为对象头
- OFFSET:偏移地址,单位字节;
- SIZE:占用的内存大小,单位为字节;
- TYPE DESCRIPTION:类型描述,其中object header为对象头;
- VALUE:对应内存中当前存储的值
- 关闭指针压缩后,对象头为16字节:-XX:-UseCompressedOops
思考: 下面例子中obj对象占多少个字节?
基本数据类型:
Type | Bytes |
---|---|
byte,boolean | 1 |
char,short | 2 |
int,float | 4 |
long,double | 8 |
package com.cctv;
import org.openjdk.jol.info.ClassLayout;
public class ObjectTest {
public static void main(String[] args) throws InterruptedException {
Object obj = new Test();
//查看对象内部信息
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
}
}
class Test {
private long p;
}
回到之前的问题: synchronized加锁加在对象上,对象是如何记录锁状态的?
锁状态被记录在每个对象的对象头的Mark Word中