深入剖析JAVA对象
JOL = Java Object Layout
org.openjdk.jol
jol-core
0.9
jclasslib - idea 插件
HOTSPOT的对象构成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)
- hashcode
- 锁信息
- GC信息
著名的三色标记算法
它的中间信息就记录在对象头部
对象头中的锁信息轻量级锁:自旋锁 CAS
AtomicInteger -> Unsafe -> Unsafe.cpp -> lock cmpxchg
lock 为什么能实现原子性?锁总线 / 锁缓存行
缓存行?//三级缓存 MESI 以及缓存不同行的编程技巧
重量级锁:交给OS去管理的锁
- 排队
为什么轻量级锁可以解决同步问题(自旋),但是也需要重量级锁的存在?什么情况用轻?什么情况用重?