本文将通过JOL
分析Java对象的内存布局
,包括伪共享
、DataModel
、Externals
、数组对齐
等内容
代码托管在https://github.com/zhongmingmao/java_object_layout
伪共享
Java8
引入@sun.misc.Contended
注解,自动进行缓存行填充
,原始支持
解决伪共享问题
,实现高效并发,关于伪共享
,网上已经很多资料,请参考下列连接:
- https://yq.aliyun.com/articles/62865
- http://www.cnblogs.com/Binhua-Liu/p/5620339.html
- http://blog.csdn.net/zero__007/article/details/54951584
- http://blog.csdn.net/aigoogle/article/details/41517213
- http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/tip/src/share/classes/sun/misc/Contended.java
代码
1 | // JVM Args : -Djol.tryWithSudo=true -XX:-RestrictContended |
运行结果
1 | # Running 64-bit HotSpot VM. |
分析
- 本机CPU采用的
Intel I5 Broadwell
,Cache Line Size
为64 Bytes
,相关链接Broadwell - 在对象头部后插入了
128 Bytes
的Padding
,这样保证了同一缓存行
中,不可能同时容纳2
个JOLSample_09_Contended$A
实例,避免了伪共享
的问题 @Contended
注解的相关概念请查看代码Contended.java
性能对比代码
1 | // JVM Args : -Djol.tryWithSudo=true -XX:-RestrictContended |
性能对比结果
1 | me.zhongmingmao.jol.FalseSharingTest$CommonLong object internals: |
DataModel
代码
1 | // JVM Args : -Djol.tryWithSudo=true |
运行结果
1 | ***** Current VM Layout |
分析
CurrentLayouter
是真实
的内存布局,HotSpotLayouter
是模拟
的内存布局- 通过
parseInstance(Object instance, Layouter layouter)
能够观察在不同DataModel
下synchronized锁升级
的过程
Externals
之前显示的都是internals size
(即shallow size
),这里展示externals size
(retained size
=internals size
+externals size
)
代码
1 | // JVM Args : -Djol.tryWithSudo=true |
运行结果
1 | me.zhongmingmao.jol.JOLSample_16_AL_LL$A@7de26db8d, me.zhongmingmao.jol.JOLSample_16_AL_LL$B@1175e2dbd, me.zhongmingmao.jol.JOLSample_16_AL_LL$B@36aa7bc2d, me.zhongmingmao.jol.JOLSample_16_AL_LL$B@76ccd017d footprint: |
分析
遍历数组objects
相连的外部对象,并做了统计
数组对齐
代码
1 | // JVM Args : -Djol.tryWithSudo=true |
运行结果
1 | # Running 64-bit HotSpot VM. |
对象布局

分析
数组对齐
与前面字节对齐
的例子类似,在64-bit Hotspot JVM
按8 Bytes
对齐