由于oracle jdk从jdk8u201以后就不提供免费下载了,因此最近在看openjdk的分支实现,网上搜了下,有下列选择和比较(咱们目前主要在跑的是open jdk,很多人推荐的zulu openjdk尚未跑过)。oracle
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暂停时间。class
内存使用状况:
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相对较新,Micrometer提供的指标可能没法正确显示实际吞吐量和资源使用状况。也多是个人设置有负责致使这种差别。我试图经过查看不一样状况下的指标来排除第二个问题。
若是您想使用GraalVM的多语言功能,固然其余JVM不提供合适的替代方案。GraalVM也提供了我没有测试的本机编译选项(我在同一个JAR上执行了测试)。此功能可能会大大提升性能。
https://www.jdon.com/50843
https://cn.azul.com/downloads/zulu/