You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:20:39