代码之家  ›  专栏  ›  技术社区  ›  Vinicius Braz Pinto

哈希表使用多少内存?

  •  9
  • Vinicius Braz Pinto  · 技术社区  · 17 年前

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

    2 回复  |  直到 17 年前
        1
  •  14
  •   BobMcGee    17 年前

    编辑; 哦,天哪,我是个白痴,我给了hashmap信息,而不是hashtable。但是,在检查之后,出于内存目的,实现是相同的。

    这取决于VM的内部内存设置(项目的打包,32位或64位指针,以及单词对齐/大小),而Java没有指定。

    可以找到估计内存使用的基本信息 here .

    你可以这样估计:

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

    因此,将其组合在一起(对于32/64位Sun Hotspot JVM): hashmap需要24个字节(本身,主字段)+12个字节(槽数组常量)+每个槽4或8个字节+每个条目24/40个字节+键对象大小+值对象大小+将每个对象填充为8个字节的倍数

    或者,大致(最多默认设置,不保证精确):

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

    注意:这需要更多的检查,64位虚拟机上的对象开销可能需要12个字节。 我不确定空值——空值的指针可能以某种方式被压缩。

        2
  •  4
  •   Boune    17 年前

    很难估计。我会先读这个: http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html

    只需使用sunjdk工具计算出k、v和

    jmap-历史记录

    num实例字节类名称

    1:126170 19671768 MYK玻璃

    2:126170 14392544 MYV玻璃

    3:120000我的哈希表

    如果不需要同步,也可以使用hashmap而不是hashtable。