由於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/