ConcurrentHashMap 初始化

我们在我们的多线程应用程序中使用下面ConcurrentHashMap作为缓存。

private static Map<String, TransactionPriceItemDetailSummaryVO> pritmSummaryMap = new ConcurrentHashMap<String, TransactionPriceItemDetailSummaryVO>();

我们正在创建130 个线程来访问和更新此地图。

最终地图大小约为1 亿(对象)。

我在网上读到我们需要指定参数ConcurrentHasMap来提高它的性能。

谁能建议我们如何为我们的案例计算参数?

clear()另外,调用此地图以释放内存是最佳做法吗?


缥缈止盈
浏览 148回答 3
3回答

慕斯709654

来自java doc:理想情况下,您应该选择一个值来容纳尽可能多的线程来同时修改表。既然你说... 130 个线程正在访问和更新此地图那么你应该使用new ConcurrentHashMap<String, TransactionPriceItemDetailSummaryVO>(130)正如@Bohemian 所说,设置一些更大的值以避免调整大小。仅当您不需要内容时才调用 clear。

holdtom

您可以使用以下构造函数配置您的地图:ConcurrentHashMap<K,V>(initialCapacity, loadFactor, concurrencyLevel).initialCapacity:虽然您提到您将插入 100M 个对象,但您是否要将它们保留在地图中?还是就像添加和删除对象一样?如果您要保留所有这些而不是删除它们,那么按照 Bohemian 的建议保留此值是有意义110_000_000的,否则,您应该在任何给定时间点将其保留为地图的 appx 平均大小。loadFactor: 较高的负载因子值会减少空间开销,但会增加查找成本。这意味着它对get并且put因为这两种方法都在内部进行查找具有重大影响。默认情况下,它0.75通常被认为是空间利用率和查找时间之间的良好折衷。concurrencyLevel:估计的并发更新线程数。在这种情况下,您提到的数字是130clear()通过分析您何时调用删除所有元素,可以进一步深入挖掘上述值。

慕田峪9158850

有了这么多的条目和线程,您可以通过构造函数告诉它预期的大小来帮助实现更好地执行:new&nbsp;ConcurrentHashMap<>(110_000_000,&nbsp;10,&nbsp;130);尝试不同的数字以找出有效的方法。请注意,使用这么多项目,您将获得很高的哈希冲突率。考虑使用基于不同键的嵌套映射,以便每个映射的条目更少,例如 1M 以下。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java