【发布时间】:2021-01-08 16:31:19
【问题描述】:
我有一个像这样的 ConcurrentHashMap:
HashMap<String, Integer> fruitMap = new ConcurrentHashMap<>();
键是 10 个字符的 String,值是 Integer。
假设我的应用程序中没有其他消耗内存的代码,我如何计算可以存储在 10GiB 内存服务器上的 HashMap 中的条目数?
如果您能提及我们如何为 Java 7 和 Java 8 或更高版本计算它,那就太好了。
PS:我找到了this,但我不明白 100 个 int 映射到 int 的 hashmap 的 6.75KB 内存使用量是如何得出的。
【问题讨论】:
-
这取决于 JVM 版本、堆的大小以及某些启用/禁用标志。没有
X答案。当然HashMap不能分配给ConcurrentHashMap -
你不会得到一个确切的数字,但是一个大概的数字,对你来说足够了吗,例如10M 条目 vs. 100m 整体 vs. 1B 条目!?
-
6.75KB 是因为,它不是存储的原始类型,而是具有一些开销的 Integer 对象。参考这个-stackoverflow.com/questions/8419860/…。此外,哈希映射在内部将数据存储在桶中......映射到相同哈希码的所有键都将在同一个桶中。这也有一些开销。
-
@luk2302 为什么这么说?当然,您可以在启用特定标志的特定 JVM 版本下计算确切的大小。
-
@Eugene 确切的大小将取决于确切的内容(对桶、链等的影响)、负载因子、并发级别、初始大小等,因此很难一概而论。