一个1000万HashMap,会占用多少空间内存?其中,Key=String(长度不超过16字符,且重复性极小),Value=Integerhtml
table 数组所占内存java
table 中的每一个元素 Entry 所占内存数组
为了方便统计,咱们作以下假设:jvm
Key hash 以后的结果彻底不重复(单个 bucket 最多一条记录)。oop
loadFactor = 0.75 (默认值)。布局
64位JVM,原本reference应该是8byte,可是对象指针压缩XX:+UseCompressedOops
默认就是开启的,reference变为4byte。3d
对象头(header) + 实例数据 + padding(align)指针
对象头大小:16byte,默认开启对象指针压缩以后,变为为12byte。 padding(align):8byte对齐。
存放1千万记录,通过屡次 resize 以后:table.length() = 16777216
code
table 数组所占用空间为 = 16777216 * 4(数组的每一项都是一个Entry引用) + 16 (java arrays header size) = 67108864 + 16 = 67108880
不考虑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
http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html
http://mindprod.com/jgloss/sizeof.html
http://www.jroller.com/maxim/entry/again_about_determining_size_of
http://yueyemaitian.iteye.com/blog/2033046
http://yueyemaitian.iteye.com/blog/2034305
http://rednaxelafx.iteye.com/blog/730461
http://stackoverflow.com/questions/11054548/what-does-the-usecompressedoops-jvm-flag-do-and-when-should-i-use-it