您可能想阅读这个问题。 https://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java不同的 CPU 架构、VM 实现以及不同的 Java 版本之间的对象开销会有所不同(例如 OOPS,也有以下建议)fixnums https://blogs.oracle.com/jrose/entry/fixnums_in_the_vm etc.).
但让我们 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/AbstractMap.java 亲眼看看 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/HashMap.java对于 OpenJDK 7,HashMap
class:
开销为 48 字节HashMap
家政信息。大概是8个字节。
实施中的三个字段持有以下观点:keySet()
, values()
and entrySet()
方法。三分球,就是12 bytes在 32 位机器上。
// 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
and modCount
. 12 字节。
有一个float
field: loadFactor
. 4 bytes.
表指针本身(Entry[] table
). 4 bytes.
(the static final
字段不算数,它们是编译时常量)
一切给予我们的40 bytes的固定成本HashMap
实例。它不是 48 字节,我不知道为什么。也许我错过了一些东西,也许你的文字提到了其他版本。这些事情有时会发生一些变化。过去可能有一个额外的字段。也许它被从 40 字节填充到 48 字节(但不应该)。
数组为 16 +(条目 * 4 字节)
The Entry[] table
当表被实例化时HashMap
被构造出来了,我们也需要对其进行计数。
实例化数组需要8 bytes内务管理数据,4 bytes
为了length
财产。那是12 bytes,而不是 16。同样,不知道它来自哪里。
每个条目都是一个指向Entry
对象,所以就是4 bytes每个条目。那很简单。
每个键 ↔ 值条目额外 32 个字节
Again, 8 bytes家政服务。
现在,字段:
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 bytes每个条目。再说一遍,这不是 36。
我不知道你得到的数字是从哪里来的。那可能是 IBM 虚拟机吗?那可能是 64 位操作系统吗?也许现在的内务信息是 16 个字节(Java 8 会改变什么吗?)。
无论如何,我尝试根据我所知计算内存消耗。