gpt4 book ai didi

java - 计算Java中HashMap的内存需求

转载 作者:行者123 更新时间:2023-12-02 02:26:06 25 4
gpt4 key购买 nike

我有一个像这样的 ConcurrentHashMap:

HashMap<String, Integer> fruitMap = new ConcurrentHashMap<>();

键是一个 10 个字符的String,值是一个Integer

假设我的应用程序中没有其他消耗内存的代码,如何计算具有 10GiB 内存的服务器上的 HashMap 中可以存储的条目数?

如果您能提及我们如何针对 Java 7 和 Java 8 或更高版本计算它,那就太好了。

PS:我找到了this ,但是我不明白100个int映射到int的hashmap的6.75KB内存使用量是如何得出的。

最佳答案

我只会为您提供一个使用 JOL 针对 jdk-15 的示例(这是我对此唯一信任的可靠工具),对于具有 10 个条目的 ConcurrentHashMap ,这取决于您。

Map<String, Integer> throttleMap = new ConcurrentHashMap<>();

for(int i = 0; i< 10; ++i){
throttleMap.put((""+i).repeat(10), i);
}

System.out.println( GraphLayout.parseInstance((Object)throttleMap).toFootprint());

这将输出:

 COUNT       AVG       SUM   DESCRIPTION
10 32 320 [B
1 80 80 [Ljava.util.concurrent.ConcurrentHashMap$Node;
10 16 160 java.lang.Integer
10 24 240 java.lang.String
1 64 64 java.util.concurrent.ConcurrentHashMap
10 32 320 java.util.concurrent.ConcurrentHashMap$Node
42 1184 (total)

理解上述内容并不简单。 Integer 是最简单的:

  • 两个 header 12 个字节
  • 内部 int 字段 4 个字节

因此,对于一个 16 字节,您有 10 个字节,因此该行:

0        16       160   java.lang.Integer

String 的实例涉及更多:

  • header 12 个字节
  • 哈希字段为 4 个字节
  • coder 字段 1 个字节
  • hashIsZero 字段为 1 个 boolean 值 ( what is hashIsZero? )
  • 2 个字节用于填充
  • 4 个字节的(字节[])

所以24字节 * 10:

 10        24       240   java.lang.String

内部byte []还将添加:

  • 12 字节 header (byte[] 是一个对象)。
  • 长度字段为 4 个字节
  • 每 10 个字节 10 个字节
  • 6 字节填充

因此:

 10        32       320   [B

了解整体情况留给您作为练习。

关于java - 计算Java中HashMap的内存需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65632816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com