赞
踩
问题
一个1000万HashMap,会占用多少空间内存?其中,Key=String(长度不超过16字符,且重复性极小),Value=Integer
HashMap内存主要组成部分
table 数组所占内存
table 中的每个元素 Entry 所占内存
假设
为了方便统计,我们做如下假设:
Key hash 之后的结果完全不重复(单个 bucket 最多一条记录)。
loadFactor = 0.75 (默认值)。
JDK 版本:
64位JVM,本来reference应该是8byte,但是对象指针压缩XX:+UseCompressedOops默认就是开启的,reference变为4byte。
Java对象内存布局
对象头(header) + 实例数据 + padding(align)
对象头大小:16byte,默认开启对象指针压缩之后,变为为12byte。
padding(align):8byte对齐。
table数组所占空间
存放1千万记录,经过多次 resize 之后:table.length() = 16777216
table 数组所占用空间为 = 16777216 * 4(数组的每一项都是一个Entry引用) + 16 (java arrays header size) = 67108864 + 16 = 67108880
Entry空间统计
不考虑reference,单个Entry对象所占空间为:32
reorder 之后的顺序如下:
object header size = 12
int hash = 4
reference key = 4
reference value = 4
reference next = 4
padding(align)= 4
然后 key 所占空间:72
String
object header size = 12
int hash = 4
int hash32 = 4
reference value[] = 4char[]
arrays header size = 16
char[] = 16 * 2 (一个字符两个字节 utf - 16)
value 所占空间:16
Integer
object header size = 12
int value = 4
1千万记录对应1千万个 Entry 对象,占用总空间为: 10000000 * (32 + 72 + 16) = 1200000000
总的空间
67108880 + 1200000000 = 1267108880 / 1024 * 1024 = 1208M
参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。