尽管大多数开发人员仍然使用Java 8 ,但Java 11还是在不久前发布的。 让我们看看其中哪个对OptaPlanner更快。 找出答案的最佳方法当然是运行OptaPlanner基准测试。 本文是我们针对Java 8的类似文章的后续文章 。
基准方法
为了运行基准测试,我们使用了:
- 运行RHEL 6,运行
2 x Intel® Xeon® CPU E5-2609 0 @ 2.4 GHz (8 cores total)
和31.3 GiB
RAM内存的稳定机器,无需运行任何其他计算要求高的进程。 - 两种Java版本的G1和Parallel GC都比较了垃圾回收的影响。 Java分别使用
-Xmx1536M -server -XX:+UseG1GC
和-Xmx1536M -server -XX:+UseParallelGC
参数执行。 - 两种Oracle Java 8:
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
和OpenJDK 11:
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
- OptaPlanner
7.14.0.Final
- 解决计划问题不涉及任何IO (启动期间要加载输入的时间只有几毫秒)。 一个CPU完全饱和。 它会不断创建许多短命的对象,然后GC会收集它们。
- 每次运行都可以使用OptaPlanner解决11个计划问题。 每个计划问题将运行5分钟,并从30秒的JVM预热开始,将其丢弃。
- 基准衡量每毫秒计算出的分数数。 越高越好。 为拟议的规划解决方案计算分数并非易事:涉及许多计算,包括检查每个实体与每个其他实体之间的冲突。
执行摘要
使用Java 11,G1的平均改进为16.1 % ,并行GC的平均改进为4.5% 。 尽管并行GC面向吞吐量,而G1则侧重于低延迟垃圾回收,但是Java 11中G1的显着改进导致可以直接比较这两种垃圾回收算法 。 有关各种GC算法之间差异的更多信息,请参见本文 。
这表明并行GC仍然是OptaPlanner的首选GC,因为吞吐量对于解决OptaPlanner的优化问题比GC引入的延迟更为重要。
结果
Java 8和Java 11
云平衡 | 机器重新分配 | 课程安排 | 考试安排 | 护士名册。 | 巡回赛 | ||||||
JDK | 200度 | 800c | B1 | B10 | c7 | c8 | s2 | s3 | 11 | 1小时 | 14天 |
Java 8 | 38,074 | 34,870 | 113,490 | 20,398 | 4,296 | 4,840 | 7,003 | 5,437 | 2,385 | 2,021 | 812 |
OpenJDK 11 | 41,753 | 41,282 | 166,676 | 20,363 | 4,473 | 5,466 | 8,157 | 5,927 | 2,772 | 2,536 | 957年 |
区别 | 9.7% | 18.4% | 46.9% | -0.2% | 4.1% | 12.9% | 16.5% | 9.0% | 16.2% | 25.5% | 17.9% |
平均 | 16.1% |
使用G1垃圾收集器,几乎所有数据集在Java 11上都比Java 8有所改进。 平均而言,仅切换到Java 11即可实现16%的改进。对此改进的可能解释可能是Java 10中引入的JEP 307:用于G1的并行完整GC 。
云平衡 | 机器重新分配 | 课程安排 | 考试安排 | 护士名册。 | 巡回赛 | ||||||
JDK | 200度 | 800c | B1 | B10 | c7 | c8 | s2 | s3 | 11 | 1小时 | 14天 |
Java 8 | 54,990 | 52,514 | 122,611 | 13,382 | 4,821 | 5,880 | 8,775 | 6,170 | 3,234 | 2,682 | 880 |
OpenJDK 11 | 54,316 | 50,120 | 140,816 | 11,129 | 4,927 | 6,071 | 8,996 | 6,383 | 3,336 | 3,087 | 1,125 |
区别 | -1.2% | -4.6% | 14.8% | -16.8% | 2.2% | 3.2% | 2.5% | 3.5% | 3.2% | 15.1% | 27.8% |
平均 | 4.5% |
使用并行垃圾收集器,结果的确定性不及G1。 有些数据集有所改进,而另一些数据集则保持不变,甚至表现出性能下降。 但是,平均而言,Java 11的性能要高出4%以上。
Java 11上的并行GC与G1 GC
云平衡 | 机器重新分配 | 课程安排 | 考试安排 | 护士名册。 | 巡回赛 | ||||||
Java 11 | 200度 | 800c | B1 | B10 | c7 | c8 | s2 | s3 | 11 | 1小时 | 14天 |
OpenJDK 11并行GC | 54,316 | 50,120 | 140,816 | 11,129 | 4,927 | 6,071 | 8,996 | 6,383 | 3,336 | 3,087 | 1,125 |
OpenJDK 11 G1 GC | 41,753 | 41,282 | 166,676 | 20,363 | 4,473 | 5,466 | 8,157 | 5,927 | 2,772 | 2,536 | 957年 |
区别 | -23.1% | -17.6% | 18.4% | 83.0% | -9.2% | -10.0% | -9.3% | -7.1% | -16.9% | -17.8% | -14.9% |
平均 | -2.3% |
尽管与并行GC相比,G1 GC在Java 8方面显示出明显的改进,但对于大多数数据集而言,OptaPlanner的GC策略效益较低。 唯一的例外是机器重新分配,这表明G1 OptaPlanner能够更快地计算分数计算83%。 这也适用于Java 8,如使用G1 GC的“每秒分数计算计数”所示。
结论
Java 11带来了其他改进,这些改进在不同的OptaPlanner示例和数据集之间有所不同。 平均而言,使用并行GC的速度要快4.5%,使用G1 GC的速度要快16.1%。 尽管G1 GC有了显着改进,但在此基准测试中,大多数数据集的并行GC仍然更快。
翻译自: https://www.javacodegeeks.com/2019/01/how-much-faster-is-java-11.html