You might want to read this SO question.在不同的CPU架构,VM实现以及不同的Java版本之间(例如OOPS,还有fixnums等的建议),对象开销会有所不同。
But let'ssee for ourselves为的OpenJDK 7,HashMap
类:
开销为HashMap
家政信息48个字节。 大概8个字节。
执行过程中有三个字段保存keySet()
,values()
和entrySet()
方法的视图。三位指针,即32位机器上的12字节。
// from AbstractMap
transient volatile Set<K> keySet = null;
transient volatile Collection<V> values = null;
// from HashMap
private transient Set<Map.Entry<K,V>> entrySet = null
有三个int
字段:size
,threshold
和modCount
。 12个字节。
有一个float
场:loadFactor
。 4个字节。
表格指针本身(Entry[] table
)。 4个字节。
(在static final
领域不计,它们是编译时间常数)
所有这一切使我们40字节一个HashMap
实例的固定费用。这不是48个字节,我不知道为什么。也许我错过了一些东西,也许你的文字提到了其他版本。这些东西有时候会有所改变。过去可能有一个额外的领域。也许它从40到48字节填充(但不应该)。
16 +(条目* 4个字节),关于阵列
的Entry[] table
表被实例化的HashMap
被构造时,我们需要计算这一点。
一个实例化的数组需要8字节管理数据,4 bytes
为length
属性。这是12字节,而不是16.再次,不知道从哪里来。
每个条目都是指向一个Entry
对象的指针,所以这是4个字节每个条目。那很简单。每个键↔值条目
再次,8字节看家
附加32个字节。
现在,字段:
final K key; // a reference, 4 bytes
V value; // a reference, 4 bytes
Entry<K,V> next; // a reference, 4 bytes
final int hash; // an integer primitive, 4 bytes
16个字节。
这是最终计数24字节每个条目。再次,这不是36.
我不知道你从那里得到的数字来自哪里。那可能是IBM vm吗?这可能是一个64位的操作系统?也许现在看家信息是16字节(Java 8会改变什么?)。
无论如何,我试图根据我的最佳知识来计算内存消耗。
如果有人在我的计算中发现错误,请随时编辑我的帖子。 –