如何查看对象的大小
这里介绍一种工具JOL:Java Object Layout( java对象布局)
这个工具可以查看对象大小
首先在pom.xml里引入(版本时实际情况设置):
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
Java类
import org.openjdk.jol.info.ClassLayout;
public class HelloWorld {
public static void main(String[] args) {
Object o1 = new Object();
String s1 = ClassLayout.parseInstance(o1).toPrintable();
System.out.println("普通对象:\n"+s1);
Object o2 = new int[2];
String s2 = ClassLayout.parseInstance(o2).toPrintable();
System.out.println("数组对象:\n"+s2);
}
}
结果:
分析java对象的组成
观察虚拟机配置命令 java -XX:+PrintCommandLineFlags -version
普通对象
普通对象的内存结构由 markword、ClassPointer、实例数据、对齐 组成。
markword: 占8个字节 (记录了锁的标识位:标识对象的状态,GC标记:对象被回收了多少次 分代年龄)。
ClassPointer:对应的压缩设置:-XX:+UseCompressedClassPointers 开启时为4字节(默认开启) ,不开启为8字节 (属于指向哪个类型)。
实例数据:对应的压缩设置:-XX:+UseCompressedOops 开启时每个数据占4字节(默认开启), 不开启占8字节。 Oops: Ordinary Object Pointers
例如:
//类A
class A{
String a;
int b;
A() {
}
}
在压缩的情况下A的内存结构
在不压缩的情况下A的内存结构
对齐:8的倍数 (64位的机器按块来读,一下子读8个字节)。
数组对象
数组对象的内存结构由 markword、ClassPointer、数组长度、数组数据、对齐 组成。
markword:同上
ClassPointer:同上
数组长度:占4个字节(记录了数组的长度)
数组数据:占(4*数组长度)个字节。
对齐:同上。
1.其中普通对象的对象头由 markword 和 ClassPoiner 构成;数组对象的对象头由 markword 、 ClassPoiner、数组长度构成
2.关闭在压缩要在 VM options 中设置 -XX:-UseCompressedClassPointers,
-XX:+UseCompressedOops,也就是开启时Use前面是+,关闭时是-
3.此外,有的旧文章中说markword是4个字节的,那是因为那时候电脑是32位,而现在的电脑应该差不多都是64位了