为了账号安全,请及时绑定邮箱和手机立即绑定

ConcurrentHashMap 初始化

ConcurrentHashMap 初始化

缥缈止盈 2022-04-28 15:37:47
我们在我们的多线程应用程序中使用下面ConcurrentHashMap作为缓存。private static Map<String, TransactionPriceItemDetailSummaryVO> pritmSummaryMap = new ConcurrentHashMap<String, TransactionPriceItemDetailSummaryVO>();我们正在创建130 个线程来访问和更新此地图。最终地图大小约为1 亿(对象)。我在网上读到我们需要指定参数ConcurrentHasMap来提高它的性能。谁能建议我们如何为我们的案例计算参数?clear()另外,调用此地图以释放内存是最佳做法吗?
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

来自java doc理想情况下,您应该选择一个值来容纳尽可能多的线程来同时修改表。既然你说

... 130 个线程正在访问和更新此地图

那么你应该使用

new ConcurrentHashMap<String, TransactionPriceItemDetailSummaryVO>(130)

正如@Bohemian 所说,设置一些更大的值以避免调整大小。仅当您不需要内容时才调用 clear。


查看完整回答
反对 回复 2022-04-28
?
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()通过分析您何时调用删除所有元素,可以进一步深入挖掘上述值。


查看完整回答
反对 回复 2022-04-28
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

有了这么多的条目和线程,您可以通过构造函数告诉它预期的大小来帮助实现更好地执行:

new ConcurrentHashMap<>(110_000_000, 10, 130);

尝试不同的数字以找出有效的方法。

请注意,使用这么多项目,您将获得很高的哈希冲突率。考虑使用基于不同键的嵌套映射,以便每个映射的条目更少,例如 1M 以下。


查看完整回答
反对 回复 2022-04-28
  • 3 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信