【Java并发】聊聊对象内存布局和syn锁升级过程

对象存储解析:一个空Object对象到底占据多少内存?

对象内存布局

【Java并发】聊聊对象内存布局和syn锁升级过程_第1张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第2张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第3张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第4张图片
Mark Word占用8字节,类型指针占用8个字节,对象头占用16个字节。
【Java并发】聊聊对象内存布局和syn锁升级过程_第5张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第6张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第7张图片
好了,我们来看一下一个Object对占用多少空间,
【Java并发】聊聊对象内存布局和syn锁升级过程_第8张图片
因为java默认是开启压缩的。
【Java并发】聊聊对象内存布局和syn锁升级过程_第9张图片
所以在类开启压缩的时候,会自动填充4字节,所以就是16字节,而没有开启类压缩的 也是16字节。

syn锁升级

【Java并发】聊聊对象内存布局和syn锁升级过程_第10张图片
synchronized锁:由对象头中的Mark Word根据锁标志位的不同而被复用及锁升级策略
在jdk5中使用的是重量级锁,用户态和内核态有切换。
【Java并发】聊聊对象内存布局和syn锁升级过程_第11张图片
为了提升性能,引入了偏向锁和轻量级锁。其实就是性能和数据安全性的一种权衡。
【Java并发】聊聊对象内存布局和syn锁升级过程_第12张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第13张图片

无锁

        Object obj = new Object();
        System.out.println(Integer.toHexString(obj.hashCode()));
        System.out.println(ClassLayout.parseInstance(obj).toPrintable());

【Java并发】聊聊对象内存布局和syn锁升级过程_第14张图片

偏向锁

【Java并发】聊聊对象内存布局和syn锁升级过程_第15张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第16张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第17张图片
在这里插入代码片【Java并发】聊聊对象内存布局和syn锁升级过程_第18张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第19张图片

        Object obj = new Object();
        new Thread(()->{
            synchronized (obj) {
                System.out.println(ClassLayout.parseInstance(obj).toPrintable());
            }
        }).start();

在这里插入图片描述
【Java并发】聊聊对象内存布局和syn锁升级过程_第20张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第21张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第22张图片

轻量级锁

【Java并发】聊聊对象内存布局和syn锁升级过程_第23张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第24张图片

重量级锁

多个线程进行欠账资源的时候,就会将锁升级到重量级锁。
【Java并发】聊聊对象内存布局和syn锁升级过程_第25张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第26张图片
【Java并发】聊聊对象内存布局和syn锁升级过程_第27张图片

你可能感兴趣的:(#,并发编程,java,开发语言)