对象(1)

x86JVM 观察java对象组成
导入依赖
org.openjdk.jol jol-core 0.9
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")); } }

【对象(1)】对象(1)
文章图片

获得打印信息,可以看到对像的构成是由对象头、对象本身的数据和空间损失(因为需要凑够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标记。

    推荐阅读