首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在64位架构中对象头的大小翻了一番?

为什么在64位架构中对象头的大小翻了一番?
EN

Stack Overflow用户
提问于 2016-09-03 18:31:49
回答 1查看 1K关注 0票数 6

我真的不明白为什么对象头在64位应用程序中变得两倍大。对象头是8个字节,在64位中是16个,这些额外的字节是用来做什么的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>选项是另一个原因,稍后添加。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39310141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档