Hashtable使用了多少内存?

时间:2009-09-15 05:11:30

标签: java hashtable memory-management

在Java中,如果我创建一个Hashtable<K, V>并在其中放入N个元素,它会占用多少内存?如果它依赖于实现,那么什么是一个好的“猜测”?

2 个答案:

答案 0 :(得分:14)

编辑; 哦,天哪,我是个白痴,我为HashMap提供了信息,而不是HashTable。但是,在检查之后,实现对于内存目的是相同的。

这取决于VM的内部存储器设置(项目的打包,32位或64位指针以及字对齐/大小),并且不由java指定。

可以找到有关估算内存使用情况的基本信息here

您可以这样估算:

  • 在32位虚拟机上,指针为4字节,在64位虚拟机上,为8字节。
  • 对象开销是8个字节的内存(对于空对象,不包含任何内容)
  • 将对象填充为8字节(ugh)的倍数。
  • 每个hashmap都有一个小的,恒定的开销:一个float,3个int,加上对象开销。
  • 有一个插槽阵列,其中一些将有条目,其中一些将保留给新的。填充槽与总槽的比率不超过构造函数中指定的载荷因子。
  • 插槽数组需要一个对象开销,加上一个用于大小的int,以及每个插槽的一个指针,以指示存储的对象。
  • 插槽数通常是存储映射数的1.3到2倍,默认负载系数为0.75,但可能小于此值,具体取决于散列冲突。
  • 每个存储的映射都需要一个入口对象。这需要一个对象开销,3个指针,加上存储的键和值对象,加上一个整数。

所以,把它放在一起(对于32/64位的Sun HotSpot JVM): HashMap需要24个字节(本身,原始字段)+ 12个字节(插槽数组常量)+每个插槽4个或8个字节+每个条目24/40个字节+密钥对象大小+值对象大小+将每个对象填充到8个字节的多个< /强>

OR,粗略(最多默认设置,不保证准确):

  • 在32位JVM上:36字节+ 32字节/映射+键和&amp;值
  • 在64位JVM上:36字节+ 56字节/映射+键和&amp;值

注意:这需要更多检查,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。