主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

这篇具有很好参考价值的文章主要介绍了主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

市面上可供选择的JVM发行版还是有不少的。选择合适的JVM需要考虑不同的因素。性能是其中一个重要的因素。靠谱的性能研究是很困难的。在本文中,我创建了一个测试,在不同的JVM上执行对比测试。测试程序包括Spring Boot REST应用,使用Prometheus监控JVM并使用Grafana可视化。下图是示意图。除了soapui外,所有东西都在docker容器中运行。

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

隔离干扰因素

如何确定没有别的因素干扰你的设施。我们可以通过尝试隔离分配给流程的资源来实现。 例如,分配专用CPU和固定数量的内存。 我还进行了几项测试,这些测试将资源限制放在负载均衡器,监控软件和可视化软件上(为这些资源分配不同的CPU和内存)。 为进程分配特定资源(使用docker-compose v2 cpuset和内存参数)似乎不会对单个进程负载和响应时间的度量产生很大影响。 我还比较了启动,负载和无负载情况。 在这些不同情况下,测试结果没有很大变化。

为进程分配特定CPU和内存

使用docker-compose无法为进程配置特定CPU。 docker-compose v3不支持为进程分配特定的CPU,也不支持分配资源约束。 您可以想象在潜在的多主机环境中分配特定CPU并非易事。 因此,我将docker-compose文件迁移回v2,该版本允许分配特定的CPU。 可以用于监控软件,这些CPU和JVM使用的CPU隔离开。 我使用了taskset命令。

同环境测试

您如何确保所有测试都在完全相同的情况下进行? 当我针对JVM运行测试而明天再次运行相同的测试场景时,我的结果会有所不同。 这可能有各种原因,例如不同的CPU会占用工作负载,而且这些CPU也忙于处理其他事情,或者我在主机或客户操作系统中运行不同的后台进程。 即使首次测试单个JVM并在测试之后测试另一个JVM,结果也无法比较。 例如,我正在使用Prometheus收集数据。 在第二次运行期间,Prometheus数据库可能会存储更多数据。 这可能会导致添加新数据的速度变慢,这可能会影响第二个JVM性能指标。 这个例子虽然可能相当牵强,但您可以采取措施排除其他因素。 这是我选择同时执行所有测试的原因。

setup

我的环境包括一个docker-compose文件,它允许我轻松启动4个在不同JVM上运行Spring Boot应用程序。 在4个JDK的之前,我加了一个haproxy实例来进行负载均衡。 这是为了确保不同的测试之间没有时间相关的差异,保证所有JVM都同时处于相同的负载下。

为了监控结果,我使用了Micrometer保证Prometheus能够读取JVM性能指标。 我使用Grafana对数据可视化:https://grafana.com/dashboards/4701

由于GraalVM目前仅作为JDK 8版本提供,因此其他JVM也使用JDK 8。 当容器运行时,可以通过访问执行器url来检查JVM版本:localhost:8080/actuator/env

 

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE


或者使用如下命令:

docker exec -it store/oracle/serverjre:8 java -version

使用的JVM版本如下:

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


开始测试

可以在这里下载代码,然后运行命令:

sh ./buildjdkcontainers.sh</pre>
<pre class="graf graf--pre">docker-compose -f docker-compose-jdks.yml up

你可以可以访问:

  • 8080端口的haproxy
  • 9090端口的Prometheus
  • 3000端口的Grafana

需要配置Grafana访问Prometheus的数据

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

接下来配置Grafana中的dashboard:

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE


接下来,您可以对http://localhost:8080/hello(HTTP GET)执行负载测试,并在Grafana仪表板中查看结果。

操作系统差异

不同Docker镜像之间使用的OS不同。 操作系统可通过以下方式确定:

docker exec -it store/oracle/serverjre:8 cat /etc/*-release
  • azul/zulu-openjdk:8 used Ubuntu 18.04
  • oracle/graalvm-ce:1.0.0-rc9 used Oracle Linux Server 7.5
  • openjdk:8 used Debian GNU/Linux 9
  • store/oracle/serverjre:8 used Oracle Linux Server 7.5

 

我认为这不会对JVM运行产生太大的影响。OracleJDK和Graalvm使用相同的操作系统。

测试结果

使用JVM dashboard,可以轻松区分特定的差异区域,以便进一步研究它们。

cpu使用

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

GraalVM在测试期间总体CPU使用率最高。 Oracle JDK的CPU使用率最低。

响应时间

整体GraalVM的响应时间最短,OpenJDK最好,紧随Oracle JDK和Zulu。 平均而言,OpenJDK与GraalVM之间的差异约为30%。

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

垃圾回收

GraalVM加载了比其他JDK更多的类。 OpenJDK加载最少的类。 GraalVM和OpenJDK之间的差异大约是25%。 尚未确定这是否是GraalVM的固定开销,或者与所使用的类的数量成比例。

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

这些额外的类可能会导致垃圾收集期间的延迟(尽管这种相关性可能不一定是因果关系)。 GraalVM的的GC暂停时间确实最长。

下面是GC暂停时间总和的图表。 由于GraalVM中的分配失败导致了最长的GC暂停时间(顶部的一行)。

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

内存使用

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

JVM内存使用情况很有意思。 如上图所示,OpenJDK JVM使用的内存堆垛。 GraalVM和Zulu的垃圾收集行为似乎相似,但GraalVM具有更高的内存使用率。 Oracle JDK垃圾收集并不频繁。 在查看平均值时,OpenJDK JVM使用最大内存,而Zulu使用最少内存。 在较长时间内衡量时,Oracle JDK和OpenJDK的行为看起来不稳定,而Zulu和GraalVM看起来更稳定。

主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE

总结 

 

在本次测试中,我使用SOAP UI对运行在4个不同JVM上的Spring Boot Rest程序进行了压力测试。我使用Prometheus轮询JVM实例(每5s轮训一次,用Micrometer生成数据),并使用Grafana和Prometheus来显示数据。结果表明GraalVM不适合作为OpenJDK的替代品,因为它的表现更差,使用了更多资源,加载更多类而且垃圾收集时间更长。

  • GraalVM加载的类更多
  • GraalVM 上的应用程序响应时间最慢
  • GraalVM的CPU使用率最高(响应时间最慢)
  • GraalVM的GC时间最长
  • Zulu OpenJDK使用的内存最少。与Oracle JDK和OpenJDK相比,Zulu OpenJDK和GraalVM的内存使用更稳定。

当然,由于GraalVM相对较新,Micrometer提供的指标可能无法正确显示实际吞吐量和资源使用情况。也可能是我的设置导致这种差异。我通过查看不同情况下的结果来排除第二个问题。

如果您想使用GraalVM的多语言功能,那么其他JVM无此功能。GraalVM也提供了本地编译选项(我在同一个JAR上执行了测试)。此功能可能会大大提高性能。文章来源地址https://www.toymoban.com/news/detail-492438.html

到了这里,关于主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 加载错误:openjdk:17-jdk-alpine

    问题: 使用 docker build -t ****** . 命令时报错 = ERROR [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine 解决方法: 把Dockerfile文件里的 FROM openjdk:17-jdk-alpine 改为 FROM openjdk:17

    2024年02月16日
    浏览(37)
  • OpenJDK 和 OracleJDK 哪个jdk更好更稳定,正式项目用哪个呢?关注者

    OpenJDK 和 OracleJDK:哪个JDK更好更稳定,正式项目应该使用哪个呢?我会从,从开源性质、更新和支持、功能差异等方面进行比较,如何选择,哪个jdk更好更稳定,正式项目用哪个呢,进行比较回答 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长

    2024年01月17日
    浏览(31)
  • K8S运维 解决openjdk:8-jdk-alpine镜像时区和字体问题

    目录 一、问题 二、解决 三、完整代码 一、问题 由于项目的Dockerfile中使用openjdk:8-jdk-alpine作为基础镜像来部署服务,此镜像存在一定问题,例如时差8小时问题,或是由于字体问题导致导出excel文件,图片处理内容为空等。 二、解决 1.解决网络慢的问题 软件源修改为国内清华

    2024年02月03日
    浏览(29)
  • OpenJDK Maven 编译出错: package jdk.nashorn.internal.runtime.logging does not exist

    OpenJDK 1.8.0 Maven 3.8.5 TencentOS Server 3.1 缺少 jdk.nashorn.internal.runtime.logging 。 OpenJDK中没有nashorn.jar。 jdk.nashorn.internal.runtime.logging 在 nashorn.jar 中。 解决办法:安装jdk1.8,从jdk的安装目录中找到 nashorn.jar 拷贝到OpenJDK的对应位置。 nashorn.jar 在 %JAVA_HOME%jrelibext 目录。 JDK的高版本中

    2024年02月13日
    浏览(31)
  • 【redis】redis获取hash结构的海量数据,hgetAll、hscan、hkeys 性能大比拼

    根据上一篇文章:【Redis】 redis hash getKey getValue 两个的性能差别 我们知道hgetAll的性能是极差的,然后我们优化成hkeys的,但是hkeys真的好吗? 下面我们来说一下我们的现场,就是现场我们

    2024年01月22日
    浏览(21)
  • OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13

    OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release 同时idea控制台出现乱码 翻译:OpenJDK 64位服务器虚拟机警告:选项-Xverify:none和-noverify在JDK 13中已被弃用,可能会在将来的版本中被删除。 方法一: Edit Configurations —

    2024年02月15日
    浏览(66)
  • Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.

    提示:Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j.: Windows系统配置和JDK和Neo4j的时候,容易出现此类情况。 终端输入“neo4j start”或者是“neo4j.bat console”的时候,会出现这个问题。 提示没有安装“Neo4j service”,当执行“neo4j install-service”时,提示错误图中的错误: N

    2024年02月12日
    浏览(34)
  • 免费的Java主流jdk发行版本有哪些?

    Java的特点是百花齐放,不像c#或者go只有一家主导。oracle jdk收费了,没关系,不是只有它可用。java还有很多免费的主流的jdk发行版本,记录下来备忘。 OpenJDK - 官方网站 - 源代码 - 文档 - 下载地址 OpenJDK是其他所有jdk发行版的基础,可以用于开发和测试,但不建议将它用于J

    2024年02月12日
    浏览(39)
  • 数据库问题记录(粗略版)oracle、mysql等主流数据库通用

    1. ORA-00918:未明确定义列 该问题情况大致为:select 所取列名错误、重复等问题。 2. “select * from temp where 1=0; ”的含义 布尔值为FALSE,只返回表结构,不返回数据。 举一反三: select * from temp where 10 , 布尔值为TRUE,返回所有数据记录; select * from temp where 1=0, 暂不清楚是何

    2024年02月07日
    浏览(38)
  • 三个主流数据库(Oracle、MySQL和SQL Server)的“单表造数

    预设游标10000(必要时)  模拟新增10万条数据    1.1 oracle一条sql数据生成100万条数据   创建测试表 创建测试表 模拟新增3万条数据 开发过程中经常需要测试 SQL 在大量数据集时候的执行效率,这就需要我们在表中插入大量的测试数据,下面介绍如何使用存储过程插入大量的

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包