Java 8 Concurrent Hash Map获得性能/替代

时间:2015-11-24 18:23:49

标签: performance java-8 concurrenthashmap

我有一个高吞吐量低延迟应用程序(3000个请求/秒,每个请求100毫秒),我们大量使用Java 8 ConcurrentHashMap来执行查找。通常这些映射由单个后台线程更新,并且从这些映射中读取多个线程。

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

在另一个案例中,我看到ConcurrentHashMap.computeIfAbsent是热点,虽然映射函数的延迟非常小,但是配置文件显示computeIfAbsent占用90%的时间执行自身,而且时间非常短执行映射功能。

我的问题是,我有什么方法可以改善表现?我有大约80个线程同时从CHM读取。

1 个答案:

答案 0 :(得分:2)

  

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

最简单的事情是

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

如果你有任何延迟,你可以在低延迟系统中看到,你有问题恕我直言。