我有一个多线程程序,需要进行大量的内存分配。在四核i7 CPU上,性能表现良好,速度提升约为3.9倍。但是,在12核Xeon CPU上执行该程序时,加速值不超过5.5倍。
我应该提到GC似乎不是问题,因为VisualGC在100秒以上的执行后报告GC时间低于1秒。主要的内存使用归属于堆的Eden部分,其他部分几乎没有使用。代码进行了大量的int数组分配,并对它们执行一些算术操作。它有点像状态空间探索,无法避免分配新实例。
正如您所知,Windows和Linux的标准内存分配器对于多线程程序的性能表现不佳,而C/C++有好的替代方案,如tcmalloc和Hoard。由于并行部分由完全独立的任务组成,且GC时间非常短,我怀疑主要原因可能是JVM的内存分配器在太多线程竞争分配时性能不佳。
是否有人在大规模多线程程序中有JVM内存分配器的经验,并可以就如何解决这个问题给出建议?
附言:我已经测试过JVM 6、7和8的代码。分配速率也非常高(约每秒1000万次),但正如我所提到的,Eden部分被大量使用,工作集小于1 GB。
我应该提到GC似乎不是问题,因为VisualGC在100秒以上的执行后报告GC时间低于1秒。主要的内存使用归属于堆的Eden部分,其他部分几乎没有使用。代码进行了大量的int数组分配,并对它们执行一些算术操作。它有点像状态空间探索,无法避免分配新实例。
正如您所知,Windows和Linux的标准内存分配器对于多线程程序的性能表现不佳,而C/C++有好的替代方案,如tcmalloc和Hoard。由于并行部分由完全独立的任务组成,且GC时间非常短,我怀疑主要原因可能是JVM的内存分配器在太多线程竞争分配时性能不佳。
是否有人在大规模多线程程序中有JVM内存分配器的经验,并可以就如何解决这个问题给出建议?
附言:我已经测试过JVM 6、7和8的代码。分配速率也非常高(约每秒1000万次),但正如我所提到的,Eden部分被大量使用,工作集小于1 GB。