当前位置:首页 > Java技术 > 几种OpenJDK的JVM性能比较

几种OpenJDK的JVM性能比较

2022年08月05日 19:35:45Java技术2

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上执行了测试)。此功能可能会大大提高性能。

作者:Vincent_Chiu_
来源链接:https://blog.csdn.net/weixin_41712059/article/details/90203297

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/18033.html

分享给朋友:

“几种OpenJDK的JVM性能比较” 的相关文章

性能优化|快速掌握JVM内存分配机制

性能优化|快速掌握JVM内存分配机制

JVM整体结构 堆 线程共享的区域,也是垃圾回收器要收集的区域,这地方主要保存用户创建的对象。例如 new User(),这个对象是保存在堆上面的。...

OpenWrite技术自媒体界的JVM一次编辑、随处发布

OpenWrite技术自媒体界的JVM一次编辑、随处发布

原文 :https://mp.weixin.qq.com/s/KUtJ2dwhBRuJ2G_-PkQFEA 最懂你的科技自媒体管理平台 【实用小工具推荐】给科技或技术同学们推荐一款比较好用的工具,可以实现一稿多发,主流的技术渠道基本涵...

性能优化|一张图带你了解JVM是如何进行内存分配

性能优化|一张图带你了解JVM是如何进行内存分配

对象优先在新生代分配 如果对象能够在eden区分配,那么就直接在eden区分配 如果eden区域大小不够新对象存储的话,则会触发一次minor gc, 如果minor gc后发现对象也无法在s区分配,则会直接在老年代中分配...

IDEA启动失败,报Failed to create JVM错误的解决办法

IDEA启动失败,报Failed to create JVM错误的解决办法

IDEA启动失败,报Failed to create JVM错误的解决办法 从网上下载的破解版IDEA,照网上的pojie方法进行破解时,很多人是用Windows自带的记事本添加并保存的。但是用记事本保存的文件是带有BOM的,从而导致启动IDEA报...

[JVM教程与调优] 为什么要学习JVM虚拟机?

[JVM教程与调优] 为什么要学习JVM虚拟机?

JVM在我们开发阶段不会用到,但是到了生产环境中,那么就会变得非常重要了。 为什么这么说呢? 一方面,因为我们的生产环境是比较复杂的。各种可能的问题都会出现,比如说:硬盘坏了、网络坏了、CPU利用率高了等问题层次不穷。 另外一方面,在我们生产环境出现问题,还不好进行定位。因为没...

Java String(JVM角度)

Java String(JVM角度)

基本特性 存储结构变更 jdk8及之前的jdk版本中,String的内存存储结构是char[]字符数组,但是在Jdk9及之后改成了byte[]字节数组。 原因是,堆空间中大部分的字符串内容都是latin字符,基本上...

JVM 从入门到精通(二)JVM和Java体系结构

JVM 从入门到精通(二)JVM和Java体系结构

写在前面:我是「云祁」,一枚热爱技术、会写诗的大数据开发猿。昵称来源于王安石诗中一句 [ 云之祁祁,或雨于渊 ] ,甚是喜欢。 写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对 数据中台...

JVM中有哪些垃圾收集器?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 新生代垃圾...

JVM内存模型及垃圾收集策略解析

JVM内存模型及垃圾收集策略解析

JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Java中的JVM内存模型及垃圾收集的具体策略进行综合的分析。 一 JVM内存模型...

jvm优化——运行参数篇

jvm优化——运行参数篇

在这篇文章中主要介绍jvm的一些运行参数 对jvm优化总结篇可以阅读:JVM优化——总结篇 1、jvm的运行参数 1.1、三种参数类型 jvm的参数类型分为三种,分别是: 1、标准参数: 标准参数的意思是说一般比较稳定,在以后jvm的版...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。