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的指针可能会被压缩.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...