JVM有许多不同的选择。哪个最好用?比较几种JVM性能; Zulu OpenJDK,OpenJDK,Oracle JDK,GraalVM CE。

在这篇博客中,我将描述我创建的用于同时在不同JVM上执行测试的设置。我还研究了资源隔离的影响(为进程分配特定的CPU和内存)。这种影响可以忽略不计。我的测试应用程序由一个反应性(非阻塞)Spring Boot REST应用程序组成,我使用Prometheus轮询JVM和Grafana进行可视化。除SoapUI外,一切都在Docker容器中运行。

使用了以下版本:

  • GraalVM CE rc9 (8u192)
  • OpenJDK 8u191
  • Zulu 8u192
  • Oracle JDK 8u181

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为同一个应用程序加载更多类
  • GraalVM导致应用程序的响应时间最慢
  • GraalVM使用大多数CPU(以实现最慢的响应时间)
  • GraalVM使用大部分时间进行垃圾收集
  • 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 /?