微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Hashtable使用多少内存?

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

解决方法

编辑;哦,geez,我是个白痴,我给了HashMap的信息,而不是HashTable.然而,在检查之后,为了存储目的,这些实现是相同的.

这取决于您的VM的内部存储器设置(项目的打包,32位或64位指针和字对齐/大小),并没有被java指定.

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

你可以像这样估计:

>在32位虚拟机上,一个指针是4字节,在64位虚拟机上,它是8字节.
>对象开销是8字节的内存(对于空对象,不含任何内容)
>对象被填充到8字节(ugh)的倍数的大小.
>每个hashmap有一个小的,不断的开销:一个float,3个ints,加上对象开销.
>有一组插槽,其中一些将有条目,其中一些将保留为新的.填充槽与总槽的比例不超过构造函数中的指定负载系数.
>插槽数组需要一个对象开销,加上一个int大小,加上每个插槽的一个指针,以指示存储的对象.
>插槽数通常是存储映射数的1.3到2倍,负载因子为0.75,但可能小于此值,这取决于哈希冲突.
>每个存储的映射都需要一个条目对象.这需要一个对象开销,3个指针,加上存储的键和值对象,加上一个整数.

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

或大致(至多认设置,不能保证是准确的):

> 32位JVM:36字节32字节/映射键&值
> 64位JVM:36字节56字节/映射键&值

注意:这需要更多的检查,64位VM上的对象开销可能需要12个字节.我不知道空值 – null的指针可能会被压缩.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐