当前位置: 首页 > 科技观察

Java8最快的垃圾收集器是什么?

时间:2023-03-14 09:10:15 科技观察

OpenJDK8具有多种GC(垃圾收集器)算法,例如ParallelGC、CMS和G1。哪个最快?如果在Java9中将Java8的默认GC从ParallelGC更改为G1(目前只是一个提议)会怎么样?让我们对此进行基准测试。基准测试方法运行相同的代码六次,每次使用不同的VM参数(-XX:+UseSerialGC,-XX:+UseParallelGC,-XX:+UseConcMarkSweepGC,-XX:ParallelCMSThreads=2,-XX:ParallelCMSThreads=4,-XX:+使用G1GC)。每次运行大约需要55分钟。其他VM参数:-Xmx2048M-serverOpenJDK版本:1.8.0_51(最新版)软件:Linux版本4.0.4-301.fc22.x86_64硬件:Intel?核?i7-4790CPU@3.60GHz每次运行13?OptaPlanner?规划问题解决方案。每次运行时间为5分钟。前30秒用于JVM预热,不计算在内。解决规划问题不涉及IO(启动时加载输入信息所需的几毫秒除外)。单个CPU使用率完全饱和。通常会创建许多短暂的对象,然后由GC回收。度量可以是计算每毫秒的分数,越高越好。计算提议的规划解决方案是一个非常重要的问题:涉及大量计算,包括每个实体与所有其他实体的碰撞检测。为了能够在本地重复运行这些基准测试,从源代码构建并运行主类GeneralOptaPlannerBenchmarkApp。BenchmarkResultsExecutionResults为了便于查看,我将每次GC与Java8默认GC(ParallelGC)进行了比较。结果非常清楚:默认(并行GC)是最快的。原始基准数据相对基准数据Java9应该默认为G1吗?有提议使用G1作为OpenJDK9服务器端的默认GC。我最好的反应是拒绝该提议:G1平均慢17.60%G1在每个数据集用例中都较慢。在***数据集(MachineReassignmentB10)下,性能比其他数据集差,G1慢了34.07%。如果开发机器和服务器之间的默认GC不同,开发人员基准测试的可信度将会降低。另一方面,有几个细节需要注意:G1关注的是GC暂停,而不是吞吐量。对于这些用例(计算量大),GC暂停持续时间几乎没有影响。这是一个(本质上)单线程基准测试。并行解决多个问题或采用多线程解决方案的基准测试结果可能会有所不同。G1的建议堆内存至少为6GB。而这个benchmark的堆内存是2GB,即使在***数据集(MachineReassignmentB10)中也只需要那么多内存。海量计算只是OpenJDK的众多功能之一:这是一个在社区中广泛争论的问题。如果其他方面(如网站服务)证明它是合理的,则可能值得更改默认GC。但是请先告诉我你实际项目的基准。结论在Java8中,默认GC(并行GC)通常是OptaPlanner用例的最佳选择。