Java中<String,String>类型HashMap的内存占用量计算咨询
Java中<String,String> HashMap内存占用计算
以下基于Java 8+版本、64位HotSpot虚拟机(默认开启指针压缩)、默认负载因子0.75的前提进行估算:
一、HashMap底层数组内存
初始化new HashMap()时默认初始容量16,当存入720万键值对时,需扩容至满足 数组容量 >= 元素数 / 负载因子 的最小2的幂:
- 计算:
7200000 / 0.75 = 9600000,最小2的幂为2^24 = 16777216 - 数组为
Node[],每个引用占4字节(压缩指针),总内存:16777216 * 4 = 67108864 字节 ≈ 64MB
二、键值对Node节点内存
Java 8的HashMap.Node结构(压缩指针下):
- 对象头:12字节
- 实例变量(hash、key引用、value引用、next引用):各4字节,共16字节
- 8字节对齐后,单个Node占32字节
- 720万Node总内存:
7200000 * 32 = 230400000 字节 ≈ 220MB
三、String对象内存
1. 键String(平均长度75)
String结构(压缩指针下):
- String对象本身:对象头12字节 + char数组引用4字节 + hash值4字节 = 20字节,对齐到24字节
- char数组:对象头12字节 + length字段4字节 + 75个char(每个2字节)= 166字节,对齐到168字节
- 单个键String总内存:
24 + 168 = 192字节 - 720万键总内存:
7200000 * 192 = 1382400000 字节 ≈ 1318MB
2. 值String(长度5)
- String对象本身:24字节(同上述结构)
- char数组:对象头12字节 + length字段4字节 + 5个char = 26字节,对齐到32字节
- 单个值String总内存:
24 + 32 = 56字节 - 720万值总内存:
7200000 * 56 = 403200000 字节 ≈ 384MB
四、总内存估算
将各部分相加:64MB + 220MB + 1318MB + 384MB ≈ 1986MB ≈ 1.94GB
注意事项
- 若值字符串是复用的(如均指向常量池中的同一个
"VALUE"),值的内存可忽略不计,总内存会减少约384MB - 若JVM关闭指针压缩,所有引用占8字节,内存会大幅增加
- 本次估算中数组容量远大于元素数,桶内几乎无链表/红黑树,无需额外计算TreeNode的内存开销
内容的提问来源于stack exchange,提问作者ph1b3r0pt1c
相关产品推荐
相关产品推荐

