JVM有许多不同的选择。哪个最好用?比较几种JVM性能; Zulu OpenJDK,OpenJDK,Oracle JDK,GraalVM CE。
在这篇博客中,我将描述我创建的用于同时在不同JVM上执行测试的设置。我还研究了资源隔离的影响(为进程分配特定的CPU和内存)。这种影响可以忽略不计。我的测试应用程序由一个反应性(非阻塞)Spring Boot REST应用程序组成,我使用Prometheus轮询JVM和Grafana进行可视化。除SoapUI外,一切都在Docker容器中运行。
使用了以下版本:
CPU使用率
GraalVM在测试期间总体CPU使用率最高。Oracle JDK的CPU使用率最低。
响应时间:
整体GraalVM的响应时间最短,OpenJDK最好,紧随Oracle JDK和Zulu。平均而言,OpenJDK和GraalVM之间的差异约为30%。
有趣的是,GraalVM加载了比其他JDK更多的类。OpenJDK加载最少的类。GraalVM和OpenJDK之间的差异大约是25%。我还没有确定这是否是GraalVM的固定数量的额外类开销,或者它是否与所使用的类的数量成比例,这是一个固定的百分比。这些额外的类可能导致垃圾收集期间的延迟(尽管这种相关性可能不一定是因果关系)。GraalVM更长GC暂停时间。
内存使用情况
OpenJDK JVM使用大部分内存。GraalVM和Zulu的垃圾收集行为似乎相似,但GraalVM具有更高的基本内存使用率。Oracle JDK似乎不那么频繁地进行垃圾收集。在查看平均值时,OpenJDK JVM使用的内存最多,而Zulu使用的内存最少。在较长时间内查看缩小的图形时,Oracle JDK和OpenJDK的行为看起来不稳定,并且可能会达到相对较高的值,而Zulu和GraalVM看起来更稳定。
使用SOAP UI进行了负载测试,其中一个响应式Spring Boot REST应用程序在循环haproxy负载均衡器后面的4个不同JVM上运行。我每隔5秒使用Prometheus轮询JVM实例(使用Micrometer生成数据),并使用Grafana和Prometheus来显示数据。结果表明GraalVM不适合作为OpenJDK的替代品,因为它表现更差,使用更多资源,加载更多类并在垃圾收集中花费更多时间。
-
GraalVM使用大多数CPU(以实现最慢的响应时间)
-
Zulu OpenJDK使用比较JVM的最少内存。与Oracle JDK和OpenJDK相比,Zulu OpenJDK和GraalVM的内存使用更稳定。
当然,由于GraalVM相对较新,Micrometer提供的指标可能无法正确显示实际吞吐量和资源使用情况。也可能是我的设置有负责导致这种差异。我试图通过查看不同情况下的指标来排除第二个问题。
如果您想使用GraalVM的多语言功能,当然其他JVM不提供合适的替代方案。GraalVM也提供了我没有测试的本机编译选项(我在同一个JAR上执行了测试)。此功能可能会大大提高性能。
OpenJDK
和 Oracle
JDK
是
Java
开发工具包的两个主要实现。两者都是
Java
SE 平台规范的实现,包含了
Java
虚拟机(
JVM
)、
Java
编程语言和
Java
库。然而,它们之间有一些重要的区别
市面上可供选择的
JVM
发行版还是有不少的。选择合适的
JVM
需要考虑不同的因素。
性能
是其中一个重要的因素。靠谱的
性能
研究是很困难的。在本文中,我创建了一个测试,在不同的
JVM
上执行对比测试。测试程序包括Spring Boot REST应用,使用Prometheus监控
JVM
并使用Grafana可视化。下图是示意图。除了soapui外,所有东西都在docker容器中运行。如何确定没有别的因素干扰你的设施。我们可以通过尝试隔离分配给流程的资源来实现。例如,分配专用CPU和固定数量的内存。
回顾下
JAVA
那些易混淆的概念,包括
JVM
/JRE/
JDK
,
openJDK
/oracle
JDK
,以及
JAVA
SE/
JAVA
EE/Jakarta EE。
我们可以看到各个工具的大小基本上都稳定在27kb左右,这个不是
JDK
开发团队刻意为之的,而是因为这些工具大多数是
jdk
\lib\tools.jar类库的一层薄包装而已,他们的主要功能代码是在tools类库中实现的。命令行工具的好处是:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程telnet到服务器上都会受到限制。而借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监...
一大早就接到了Oracle的电话,让我十分懵逼。“先生您好,从2019年1月开始, 我们对
JDK
8的支持已经到期, 不再提供免费的updates和security fi...
通过
OpenJDK
官方提供的JOL(
Java
Object Layout)工具,我们即可很方便分析、了解一个
Java
对象在内存当中的具体布局情况。这里将在64位的HotSpot
Java
虚拟机环境下进行分析、测试
Java
对象的内存布局
Java
的实例对象、数组对象在内存中的组成包括如下三部分:对象头Hearder、实例数据、内存填充。示意图如下所示对象头:其主要包括两部分数据:Mark Word、...
Runtime对
java
的运行环境进行的封装,可以得到
jvm
的状态信息,使用Runtime.getRuntime ()就可以得到Runtime的引用。. 使用Runtime的maxMemory (),totalMemory (),freeMemory ()几个方法就可以得到
jvm
的内存使用情况maxMemory是
jvm
可以从操作系统可以获得最大内存,totalMemory是
jvm
已经分配到的内存大小,freeMemory是所分配内存的剩余大小,可以通过代码运行查看。
Eclipse Temurin(曾用名:Adopt
OpenJDK
) 是Eclipse基金会基于
OpenJDK
的构建,支持Oracle公司的HotSpot虚拟机和Eclipse基金会的OpenJ9虚拟机,免费。 BellSoft Liberica
JDK
是由
OpenJDK
的贡献者之一BellSoft基于
OpenJDK
的构建,免费。 SAP SapMachine 是
OpenJDK
项目的贡献者之一SAP公司基于
OpenJDK
的构建,免费。 华为毕昇
JDK
是华为公司基于
OpenJDK
的构建,免费。
http://
jdk
.
java
.net/
java
-se-ri/8-MR3
icedtea
http://
openjdk
.
java
.net/projects/icedtea/
https://icedtea.classpath.org/wiki/Main_Page
atlassian adopt
openjdk
https://adopt
openjdk
.net/
– 开发版
jdk
国内镜像
https://mirrors4.tuna.tsinghua.edu.cn/Adopt
OpenJDK
/?