当前位置:   article > 正文

一个1000万HashMap,会占用多少空间内存?

go map 1000w万key时占用内存

问题

一个1000万HashMap,会占用多少空间内存?其中,Key=String(长度不超过16字符,且重复性极小),Value=Integer


HashMap内存主要组成部分

  1. table 数组所占内存

  2. table 中的每个元素 Entry 所占内存

假设

为了方便统计,我们做如下假设:

  1. Key hash 之后的结果完全不重复(单个 bucket 最多一条记录)。

  2. loadFactor = 0.75 (默认值)。

  3. JDK 版本:
    jvm

    64位JVM,本来reference应该是8byte,但是对象指针压缩XX:+UseCompressedOops默认就是开启的,reference变为4byte。

Java对象内存布局

对象头(header) + 实例数据 + padding(align)

  1. 对象头大小:16byte,默认开启对象指针压缩之后,变为为12byte
  2. padding(align):8byte对齐。

table数组所占空间

存放1千万记录,经过多次 resize 之后:table.length() = 16777216

table 数组所占用空间为 = 16777216 * 4(数组的每一项都是一个Entry引用) + 16 (java arrays header size) = 67108864 + 16 = 67108880

Entry空间统计

entry

不考虑reference,单个Entry对象所占空间为:32

  1. reorder 之后的顺序如下:
  2. object header size = 12
  3. int hash =  4
  4. reference key = 4
  5. reference value =  4
  6. reference next =  4
  7. padding(align)= 4

然后 key 所占空间:72

  1. String 
  2. object header size = 12
  3. int hash = 4
  4. int hash32 = 4
  5. reference value[] = 4char[]
  6. arrays header size = 16
  7. char[] = 16 * 2 (一个字符两个字节  utf - 16)

value 所占空间:16

  1. Integer 
  2. object header size = 12 
  3. 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


转载于:https://my.oschina.net/u/227422/blog/366683

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号