我们在我们的多线程应用程序中使用下面ConcurrentHashMap作为缓存。private static Map<String, TransactionPriceItemDetailSummaryVO> pritmSummaryMap = new ConcurrentHashMap<String, TransactionPriceItemDetailSummaryVO>();我们正在创建130 个线程来访问和更新此地图。最终地图大小约为1 亿(对象)。我在网上读到我们需要指定参数ConcurrentHasMap来提高它的性能。谁能建议我们如何为我们的案例计算参数?clear()另外,调用此地图以释放内存是最佳做法吗?
3 回答
holdtom
TA贡献1805条经验 获得超10个赞
您可以使用以下构造函数配置您的地图:
ConcurrentHashMap<K,V>(initialCapacity, loadFactor, concurrencyLevel)
.
initialCapacity
:虽然您提到您将插入 100M 个对象,但您是否要将它们保留在地图中?还是就像添加和删除对象一样?如果您要保留所有这些而不是删除它们,那么按照 Bohemian 的建议保留此值是有意义110_000_000
的,否则,您应该在任何给定时间点将其保留为地图的 appx 平均大小。
loadFactor
: 较高的负载因子值会减少空间开销,但会增加查找成本。这意味着它对get
并且put
因为这两种方法都在内部进行查找具有重大影响。默认情况下,它0.75
通常被认为是空间利用率和查找时间之间的良好折衷。
concurrencyLevel
:估计的并发更新线程数。在这种情况下,您提到的数字是130
clear()
通过分析您何时调用删除所有元素,可以进一步深入挖掘上述值。
慕田峪9158850
TA贡献1794条经验 获得超7个赞
有了这么多的条目和线程,您可以通过构造函数告诉它预期的大小来帮助实现更好地执行:
new ConcurrentHashMap<>(110_000_000, 10, 130);
尝试不同的数字以找出有效的方法。
请注意,使用这么多项目,您将获得很高的哈希冲突率。考虑使用基于不同键的嵌套映射,以便每个映射的条目更少,例如 1M 以下。
添加回答
举报
0/150
提交
取消