一個1000萬HashMap,會佔用多少空間內存?

問題

一個1000萬HashMap,會佔用多少空間內存?其中,Key=String(長度不超過16字符,且重複性極小),Value=Integerhtml


HashMap內存主要組成部分

  1. table 數組所佔內存java

  2. table 中的每一個元素 Entry 所佔內存數組

假設

爲了方便統計,咱們作以下假設:jvm

  1. Key hash 以後的結果徹底不重複(單個 bucket 最多一條記錄)。oop

  2. loadFactor = 0.75 (默認值)。佈局

  3. JDK 版本:
    jvmspa

    64位JVM,原本reference應該是8byte,可是對象指針壓縮XX:+UseCompressedOops默認就是開啓的,reference變爲4byte。3d

Java對象內存佈局

對象頭(header) + 實例數據 + padding(align)指針

對象頭大小:16byte,默認開啓對象指針壓縮以後,變爲爲12byte。
padding(align):8byte對齊。

table數組所佔空間

存放1千萬記錄,通過屢次 resize 以後:table.length() = 16777216code

table 數組所佔用空間爲 = 16777216 * 4(數組的每一項都是一個Entry引用) + 16 (java arrays header size) = 67108864 + 16 = 67108880

Entry空間統計

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

參考

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

相關文章
相關標籤/搜索