对象内存结构分析
空object对象占用几个字节
64位操作系统中,空的object对象占用两个字节(16位),其中8位为markword,4位为class pointer(类型指针),其中:
- 8位存放markword
- 4位存放class pointer(类型指针)(在64位操作系统中,一个指针的大小为64位,原本是8字节,但是jvm默认开启class指针压缩(参数为-XX:+UseCompressedClassPointers),开启压缩后其大小为4字节)
使用java -XX:+PrintCommandLineFlags -version可以看到命令执行的参数细节
- 4位为填充位(object alignment对象对齐,性能更好)
怎样打印出对象在内存中的布局
使用openjdk的ClassLayout可以打印,代码如下
package com.jdktest;
import org.openjdk.jol.info.ClassLayout;
public class ObjectLayout {
public static void main(String[] args) {
Object o =new Object();
System.out.println(ClassLayout.parseInstance(o).toPrintable());
synchronized (o){
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
}
}
打印出来的结果为
对象在内存中的布局
如上图所示,对象在内存中的布局可以分为两种
- 普通对象
- 数组