昨天我从 内存 和 速度 这两个维度比较了不同的 JDK 版本以及 OpenJ9 vs HotSpot 。如果你问我,一个实际工作的服务于 REST 对象的 Spring Boot 应用程序,所测试的内存部分是真实的。
速度/CPU 测试依然...缺失。因为排序一些随机数组只是其中一个特定的测试。
今天我决定对 OpenJ9 和 Hotspot 用一个实际的基准测试进行更多的测试: SPECjvm2008。
SPEC (标准性能评估公司)有几个定义良好的基准和测试,其中包括一个名为 SPECjvm2008 的老版 JVM 基准测试。这是一个详尽的基准测试事项,如压缩、编译、XML 解析等等。我决定下载这个并且给它一个与 OpenJ9 和 HotSpot 的开关。这应该是一个更公正的比较。
最初我遇到了一些问题,其中一些测试对 Java 8 不起作用,并且有些测试甚至不能在 Java 9+ 上启动。但最终我通过使用以下参数剔除了几个基准并使其正常工作:
java -jar SPECjvm2008.jar startup.helloworld startup.compiler.compiler startup.compress startup.crypto.aes startup.crypto.rsa startup.crypto.signverify startup.mpegaudio startup.scimark.fft startup.scimark.lu startup.scimark.monte_carlo startup.scimark.sor startup.scimark.sparse startup.serial startup.sunflow startup.xml.validation compiler.compiler compress crypto.aes crypto.rsa crypto.signverify derby mpegaudio scimark.fft.large scimark.lu.large scimark.sor.large scimark.sparse.large scimark.fft.small scimark.lu.small scimark.sor.small scimark.sparse.small scimark.monte_carlo serial sunflow xml.validation
这些测试中使用的 Docker 镜像都是 OpenJDK8 和 Java 8,但其中一个带有 HotSpot ,另一个带有 OpenJ9。
adoptopenjdk/openjdk8
adoptopenjdk/openjdk8-openj9
我再次启动 Docker 镜像,目录链接到包含 SPEC 基准的主机:
启动镜像:
docker run -it -v /Projects/SPECjvm2008:/app/SPECjvm2008 adoptopenjdk/openjdk8-openj9 /bin/bash
进入正确目录:
cd /app/SPECjvm2008
运行(工作)测试:
java -Xmx600m -jar SPECjvm2008.jar startup.helloworld startup.compiler.compiler startup.compress startup.crypto.aes startup.crypto.rsa startup.crypto.signverify startup.mpegaudio startup.scimark.fft startup.scimark.lu startup.scimark.monte_carlo startup.scimark.sor startup.scimark.sparse startup.serial startup.sunflow startup.xml.validation compiler.compiler compress crypto.aes crypto.rsa crypto.signverify derby mpegaudio scimark.fft.large scimark.lu.large scimark.sor.large scimark.sparse.large scimark.fft.small scimark.lu.small scimark.sor.small scimark.sparse.small scimark.monte_carlo serial sunflow xml.validation
在等待了很长一段时间之后,基准结束,我得到了下列结果。
这个表衡量值是 ops/m,越高代表越好。根据硬件不同,结果可能会有所不同。
在大多数情况下,HotSpot 比 OpenJ9 更快,在 crypto 和 derby 两种情况下, Hot Spot 速度更快。看起来这是 HotSpot 正在做一些特别的事情,而 J9(还)没有做?这对了解您是否正在处理大量密码学应用程序非常重要,例如高性能安全端点。
一个能让 OpenJ9 排第一的是 XML 校验。解析与校验也是大多数现代应用程序中的重要组成部分,所以这可能是 J9 在实际生产代码中的弥补了一些损失。
这样就能得到一个真正的结论吗?我不这么认为。
真正的教训是:通过实验、测量,你将会知道,从来不能基于一些在线的基准来决定什么。