導語: 虛擬機器(VM)想必大家都非常瞭解和熟悉,例如JVM,但支援多語言的VM卻未必熟悉。本文作者介紹了新一代高效能跨語言的虛擬機器GraalVM,主要內容包括VM的特性、和JDK8、9的效能對比,比著重介紹了作者在試用native特性時遇到的問題。
上週Oracle釋出了GraalVM [1]。如網站上所述:
高效能跨語言虛擬機器
GraalVM是一種通用的虛擬機器,用於執行JavaScript、Python 3、Ruby、R、基於JVM的語言,如Java、Scala、Kotlin和基於LLVM的語言,如C和C++。
GraalVM消除了程式語言之間的隔離,並支援共享執行時的互操作性。它可以獨立執行,也可以在OpenJDK、Node、Oracle或者MySQL上執行。
有幾個因素讓人們想從正常的JRE轉到Graal VM:
-
其中一個可能是它聲稱的改進的效能。
-
另一個可能是多語言特性,透明地混合和匹配支援的語言。
-
最後一個是前者的混合:在本地支援下,可以將Java應用程式作為原生代碼。
作為一個極客,我想先快速地看一看。下麵是我的一些使用體驗。
是否用企業版?
第一步是下載Graal VM [2]。GraalVM有兩個版本:
社群版
-
所有開源許可
-
免費供生產使用
企業版
-
測評和其他非生產用途免費使用
-
對於商業使用和支援選項,應該聯絡銷售團隊。
第一個比較驚訝的: 社群版本只能在Linux作業系統使用。對於OSX作業系統,只能使用企業版。目前還沒有適用於Windows的版本。
Graal VM結構
Graal VM結構類似於傳統的pre-9 Java JDK。
因此,GraalVM可以替代任何標準JDK。
執行 java –version輸出結果如下:
PS: 到目前為止,GraalVM僅限於Java8功能。
一些效能基準
下一步是檢查效能是否有改善。我使用JMH [3]框架來進行效能測試。
我使用以下程式碼:
使用java –jar target/benchmarks.jar命令分別在三個不同的JREs上進行測試。
GraalVM
Oracle JDK 8
Oracle JDK 9
總結:
透過資料可以得到:在效能方面,Graal VM和Java 8之間的差距並不顯著。但它們和Java 9的差距比較明顯。另外,Java 9有最高的標準偏差。
繼續體驗本地方法
GraalVM可以透過native-image命令將JAR轉換為本地可執行檔案。我嘗試著用之前建立的JAR來測試。
native-image -H:+JNI -jartarget/benchmarks.jar
然而,在嘗試執行新建立的二進位制檔案時,我遇到了下麵的錯誤資訊:
更糟糕的是,嘗試為Spring Pet Clinic [4]建立本地映象時,遇到下麵的錯誤:
GraalVM不支援動態類載入。
我嘗試了H2和HSQLDB的獨立jar檔案,但沒有用。在這兩種情況下,我得到了以下堆疊:
結論
GraalVM有很多很有前途的功能,包括多語言,儘管我現在對它不太感興趣。然而,從我有限的使用體驗來看,它仍然有改進的空間。效能方面,Graal VM要好於Java9。此外,本地方法映象在目前的狀況下,用處比較有限。恕我直言,它目前還處在MVP的階段。我急切地等待下一個版本,希望他們能在上面的問題上有所改進。
瞭解更多:
-
GraalVM主頁 [1]
-
GraalVMgithub [5]
參考連結
[1] http://www.graalvm.org/
[2] https://www.graalvm.org/downloads
[3] http://openjdk.java.net/projects/code-tools/jmh/
[4] https://github.com/nfrankel/spring-petclinic
[5] https://github.com/oracle/graal
活動預告:
6 月 1 ~ 2 日,GIAC 全球網際網路架構大會將於深圳舉行。GIAC 是高可用架構技術社群推出的面向架構師、技術負責人及高階技術從業人員的技術架構大會。今年的 GIAC 已經有騰訊、阿裡巴巴、百度、今日頭條、科大訊飛、新浪微博、小米、美圖、Oracle、鏈家、唯品會、京東、餓了麼、美圖點評、羅輯思維、ofo、迅雷、曠視、LinkedIn、Pivotal 等公司專家出席。
本期 GIAC 大會上,微服務部分精彩的議題如下:
參加 GIAC,盤點2018最新技術。點選“閱讀原文”瞭解大會更多詳情。