java - JVM内存分配器的多线程性能

标签 java multithreading memory-management jvm

我有一个执行大量内存分配的多线程程序。在四核 i7 CPU 上的性能很好,加速约为 3.9 倍。但是,当程序在 12 核 Xeon CPU 上执行时,加速值不会超过 5.5X。

我应该提一下,GC 似乎不是问题,因为 VisualGC 在执行超过 100 秒后报告 GC 低于 1 秒。主要内存使用属于堆的 Eden 部分,其他部分几乎不会被使用。该代码执行大量 int 数组分配并对它们执行一些算术运算。这有点像无法避免新实例的状态空间探索和分配。

如您所知,Windows 和 Linux 的标准内存分配器对多线程程序的性能都不能令人满意,而 tcmalloc 和 Hoard 等不错的替代方案可用于 C/C++。由于并行部分由完全独立的任务组成,GC时间很低,我怀疑主要原因应该是JVM的内存分配器在太多线程竞争分配时性能不佳。

有没有人有在大型多线程程序中使用 JVM 分配器的经验,并且可以就如何克服这个问题提供建议?

附言我已经使用 JVM 6、7 和 8 测试了代码。分配率也非常高(每秒约 1000 万次),但正如我提到的,伊甸园部分被大量使用,工作集小于 1 GB。

最佳答案

Eden 空间是否小于您的情况?如果是这样,请考虑使用 -XX:NewRatio=1 或其他合适的值。

要确定这一点,请使用 -XX:+PrintTenuringDistribution 查看分布..

关于java - JVM内存分配器的多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584669/

相关文章:

ios - Instruments,增加iPhone应用程序的分配

java - android服务以特定的时间间隔连续执行任务

java - 部署在Tomcat 7.0.57上的Spring Boot 1.2.2应用程序不启动

java - 捕获特定的异常并在所有异常下执行相同的操作?

c++ - 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试

memory-management - 如何配置Jmeter丢弃下载的文件?

java - 导入(java.util.Arrays.sort)无法解析

java - 线程和图形

c - 测试并发数据结构

iphone - 获取强烈捕获对象的 ARC 警告