一般
markword大小为 8 bytes,
class pointer 大小为 4 bytes,
实例数据大小根据成员变量来
对齐就是上面的字节数加起来必须能被8整除,不能整除补齐
如 new object:
markword大小为 8 bytes,
class pointer 大小为 4 bytes,
实例数据大小 0,
补齐就应该是:4 Bytes
最后大小为16 Bytes
每当将某个对象作为锁之后,就会改变markword,下一个锁来看markword,读出上锁信息,就会等待。等拿到锁的线程做完了之后,又会将markword改回去,这时其它线程就可继续。代码如下
class T1 {
}
public class T01 {
public static void main(String[] args) {
T1 t1 = new T1();
System.out.println(ClassLayout.parseInstance(t1).toPrintable());
synchronized (t1){
System.out.println(ClassLayout.parseInstance(t1).toPrintable());
}
System.out.println(ClassLayout.parseInstance(t1).toPrintable());
}
}
/** 输出结果
cn.itcast.hotel.T1 object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 48 72 06 00 (01001000 01110010 00000110 00000000) (422472)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
cn.itcast.hotel.T1 object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 b0 cf 45 (00000101 10110000 11001111 01000101) (1171238917)
4 4 (object header) 88 02 00 00 (10001000 00000010 00000000 00000000) (648)
8 4 (object header) 48 72 06 00 (01001000 01110010 00000110 00000000) (422472)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
cn.itcast.hotel.T1 object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 48 72 06 00 (01001000 01110010 00000110 00000000) (422472)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
Process finished with exit code 0
**/