TreeMap<Long, Long>存储1000个键值对的内存占用明细计算
TreeMap<Long, Long> 1000个唯一键值对内存占用计算
通用公式推导(基于你指定的拆分项规则)
首先对齐你给出的预设前提:
- 单个Long类型对象占用
n字节 - 单个
Entry<Long, Long>对象自身基础开销(不含键、值Long对象本身)占用2n字节,1000个条目合计2000n字节 - 单个对象引用占用
k字节,单个节点含2个子节点引用,单节点子引用开销2k
补充第4类其他相关开销项:
- 每个红黑树节点额外包含1个父节点引用,单节点父引用开销
k - 每个红黑树节点包含1个boolean类型的颜色标记,单节点开销1字节,总开销需对齐到JVM对象对齐粒度(通常为8字节)
- TreeMap本体对象的固定开销:包含对象头、size计数、modCount计数、根节点引用、比较器引用、集合视图缓存引用等,总开销记为
C,通常在24~48字节区间,和JVM配置有关
最终总内存占用X的通用公式:
X = 键值Long对象总开销 + Entry基础开销 + 节点引用总开销 + 对齐后颜色标记开销 + TreeMap本体开销 X = 2000n + 2000n + 1000*(2k +k) + 对齐后颜色开销 + C X = 4000n + 3000k + 对齐后颜色开销 + C
主流JVM实际场景数值结果
以HotSpot 64位JVM默认配置(开启指针压缩,对象对齐粒度8字节)为例:
n=24字节:对象头12字节 + long字段8字节 + 对齐填充4字节k=4字节:压缩指针长度- 对齐后颜色标记开销:1000字节向上对齐到8的倍数,计1024字节
C=32字节:TreeMap本体对齐后开销
代入计算得总内存占用:X = 4000*24 + 3000*4 + 1024 + 32 = 109056字节 ≈ 106KB
若关闭指针压缩:
k=8字节C=48字节- 计算得总内存占用
≈118KB
内容的提问来源于stack exchange,提问作者J.J. Beam
相关产品推荐
相关产品推荐

