在Java中,如果我创建一个Hashtable<K, V>
并在其中放入N个元素,它会占用多少内存?如果它依赖于实现,那么什么是一个好的“猜测”?
答案 0 :(得分:14)
编辑; 哦,天哪,我是个白痴,我为HashMap提供了信息,而不是HashTable。但是,在检查之后,实现对于内存目的是相同的。
这取决于VM的内部存储器设置(项目的打包,32位或64位指针以及字对齐/大小),并且不由java指定。
可以找到有关估算内存使用情况的基本信息here。
您可以这样估算:
所以,把它放在一起(对于32/64位的Sun HotSpot JVM): HashMap需要24个字节(本身,原始字段)+ 12个字节(插槽数组常量)+每个插槽4个或8个字节+每个条目24/40个字节+密钥对象大小+值对象大小+将每个对象填充到8个字节的多个< /强>
OR,粗略(最多默认设置,不保证准确):
注意:这需要更多检查,64位VM上的对象开销可能需要12个字节。 我不确定nulls - null的指针可能会以某种方式被压缩。
答案 1 :(得分:4)
很难估计。我先读这个: http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html
只需使用sunjdk工具来计算K,V和
的大小jmap -histo [pid]
num #instances #bytes类名
1:126170 19671768 MyKClass
2:126170 14392544 MyVClass
3:1 200000 MyHashtable
如果您不需要同步,也可以使用HashMap而不是Hashtable。