首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8并发哈希映射获得性能/替代

Java 8并发哈希映射获得性能/替代
EN

Stack Overflow用户
提问于 2015-11-24 18:23:48
回答 1查看 3.4K关注 0票数 2

我有一个高吞吐量、低延迟的应用程序(3000请求/Sec,每个请求100 we ),我们大量使用Java8 ConcurrentHashMap执行查找。通常,这些映射由单个后台线程和从这些映射读取的多个线程更新。

我看到了性能瓶颈,在分析中,我发现ConcurrentHashMap.get是热点,占用了大部分时间。

另一种情况是,我认为ConcurrentHashMap.computeIfAbsent是热点,尽管映射函数的延迟非常小,配置文件显示computeIfAbsent花费了90%的时间执行自身,而执行映射函数的时间却非常少。

我的问题是有什么办法可以提高我的表现吗?我有大约80个线程同时从CHM读取。

EN

回答 1

Stack Overflow用户

发布于 2015-11-28 11:22:00

我有大约80个线程同时从CHM读取。

最简单的事情是

  • 如果您有一个CPU绑定进程,则没有比CPU更多的活动线程,否则只会增加开销,如果这些线程在不运行时持有一个锁,因为您有太多的线程,这将是没有帮助的。
  • 增加分区的数量。您将希望至少有4倍的段/分区数,并且有线程访问单个映射。但是,如果您使用40多个线程访问CHM,则会由于缓存一致性的工作方式而产生奇怪的行为。我建议使用更高效的数据结构来实现更高的并发性。在Java 8中,concurrencyLevel是一个提示,但它比保留默认的初始化大小16要好。
  • 不要花那么多时间在CHM。找到一种在不触及共享资源的情况下完成有用工作的方法,您的线程将更有效地运行。

如果您在低延迟系统中看到任何延迟,则会遇到IMHO问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33901070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档