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

时间:2014-03-22 22:47:27

标签: java multithreading memory-management jvm

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

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

如您所知,Windows和Linux的标准内存分配器对多线程程序的性能表现不尽如人意,而且ccmalloc和Hoard等替代品可用于C / C ++。由于并行部分由完全独立的任务组成且GC时间非常短,我怀疑当太多线程竞争分配时,主要原因应该是JVM内存分配器的糟糕性能。

有没有人在大规模多线程程序中有JVM分配器的经验,可以就如何克服这个问题提出建议吗?

P.S。我已经使用JVM 6,7和8测试了代码。分配率也非常高(大约每秒1000万)但是正如我所提到的,Eden部分使用频繁且工作集小于千兆字节。

1 个答案:

答案 0 :(得分:0)

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

要确定,请使用 -XX:+ PrintTenuringDistribution 看分发..