我真的不明白为什么对象头在64位应用程序中变得两倍大。对象头是8个字节,在64位中是16个,这些额外的字节是用来做什么的?
发布于 2016-09-03 22:55:45
对象标头由两个字段组成,即syncblk和方法表指针(也称为“类型句柄”)。第二个字段很容易理解,它是一个指针,所以它必须在64位模式下从4字节增长到8字节。
syncblk是一个不太明显的例子,它是标志和值(锁所有者线程id、哈希代码、同步块索引)的混合。没有理由让它在64位模式下变得更大。重要的是在GC收集对象之后发生了什么。如果没有通过压缩堆消除空闲空间,那么对象空间将参与空闲块列表。就像一个双链接的列表。第二个字段是指向下一个自由块的前向指针。对象数据空间用于存储空闲块的大小,这是对象从不小于12个字节的基本原因。而syncblk存储指向前一个空闲块的回指针。所以现在它必须足够大来存储一个指针,因此需要增长到8个字节。所以它是8+8= 16字节。
Fwiw,64位模式下的最小对象大小为24字节,即使8 +8+4= 20字节也很好,只是为了确保所有对齐都与8对齐。对齐非常重要,您永远不希望指针值跨在L1缓存线上。使得访问x3的速度更慢。<gcAllowVeryLargeObjects>选项是另一个原因,稍后添加。
https://stackoverflow.com/questions/39310141
复制相似问题