知识卡片
对象头有成本
内容
Java对象即使没有字段也有对象头、引用和对齐等开销,集合还会为桶、节点和包装对象付费。发散:当对象数量巨大时,面向对象的表达力会转化为真实内存账单。
参考来源
- 位置:《你真的会写代码吗-2021》第2章《Reference的实现》"对象头"专栏及HashSet内存估算段落(源文件:_epub-src/OEBPS/Text/0011.xhtml)
- 结论依据:原文明确"即使是一个没有字段的对象(又称无状态对象)也会占用一些内存……本书中假设每个对象的固定开销是12字节",并进一步估算"一个'裸骨'的HashSet大约需要52字节",说明集合会为桶、节点等结构额外付费。
- 原始内容:所有对象的内存布局都是从包含JVM需要的一些标准信息的头开始的。因此,即使是一个没有字段的对象(又称无状态对象)也会占用一些内存……在本书中,假设每个对象的固定开销是12字节……一个"裸骨"(barebone)的HashSet大约需要52字节。set中的每个元素需要有一个链表的引用,以及一个单元素的链表:约再增加32字节。