x86JVM 观察java对象组成
导入依赖
<dependencies> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency> </dependencies>
main:
import org.openjdk.jol.info.ClassLayout;
public class 对象头 {
static int a = 1;
static int[] a1 = {1};
static boolean[] b = new boolean[2] ;
static String c = "1";
static long e = 1;
public static void main(String[] args) {
System.out.println(ClassLayout.parseInstance(a).toPrintable());
System.out.println("===============================");
System.out.println(ClassLayout.parseInstance(a1).toPrintable());
System.out.println("===============================");
System.out.println(ClassLayout.parseInstance(b).toPrintable());
System.out.println("===============================");
System.out.println(ClassLayout.parseInstance(c).toPrintable());
System.out.println("===============================");
System.out.println(ClassLayout.parseInstance(e).toPrintable());
System.out.println("===============================");
System.out.println(System.getProperty("os.arch"));
}
}
获得打印信息,可以看到对像的构成是由对象头、对象本身的数据和空间损失(因为需要凑够8的倍数)组成,普通对象的对象头长度在x86的JVM里是8字节,数组对象的对象头长度则是12字节。
对象头 包含了堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息,它是GC管理的堆对象开头的 公共结构 。(Survivor区使用复制算法,分为From Survivor和To Survivor两个部分,在每次Minor GC/Young GC后仍存活的对象就会被复制到另一个区上,但每复制一次其年龄会+1,满十五次该对象会被移动到Old Gen,十五次是因为对象头有4个bit位来计算年龄,其标识范围为0~15)
对象在synchronized使用中有五种状态,1.无状态。2.偏向锁。3.轻量锁。4.重量锁。5.GC标记。