我有一个多线程程序,可以分配大量内存。四核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部分使用频繁且工作集小于千兆字节。
答案 0 :(得分:0)
伊甸园的空间是否小于你的情况?如果是这样,请考虑使用 -XX:NewRatio = 1或其他适当的值。
要确定,请使用 -XX:+ PrintTenuringDistribution 看分发..