深入剖析JAVA对象

深入剖析JAVA对象

JOL = Java Object Layout

<dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.9</version>
        </dependency>

jclasslib - idea 插件

HOTSPOT的对象构成

image.png

new Object();

对象内部装有成员变量

  • markword 8bytes
  • class pointer - 指向对象所属的class (一般是4bytes)
  • instance data - 成员变量
  • padding - 8字节对齐

理解对象的大小

public class JustTest { //JOL = Java Object Layout //OpenJDK

    private static class T {
        int i;
        long l;
        boolean b;
        String s = "http://mashibing.com";

        void m(){};
    }

    public static void main(String[] args) {

        T t = new T();
        System.out.println(ClassLayout.parseInstance(t).toPrintable());

    }
}

对象头的奥秘(mark word)

image.png

  • hashcode
  • 锁信息
  • GC信息

对象头中的hashcode

对象头中的GC信息

著名的三色标记算法

它的中间信息就记录在对象头部

对象头中的锁信息

image.png

轻量级锁:自旋锁 CAS

AtomicInteger -> Unsafe -> Unsafe.cpp -> lock cmpxchg

lock 为什么能实现原子性?锁总线 / 锁缓存行

缓存行?//三级缓存 MESI 以及缓存不同行的编程技巧

重量级锁:交给OS去管理的锁

  • 排队

为什么轻量级锁可以解决同步问题(自旋),但是也需要重量级锁的存在?什么情况用轻?什么情况用重?

おすすめ

転載: blog.csdn.net/qq_25580555/article/details/119925938