GraalVM 21發佈,引入使用Java開發的虛擬機

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.graalvm.org\/","title":"","type":null},"content":[{"type":"text","text":"GraalVM"}]},{"type":"text","text":"21.0主版本發佈了,包含了一個新組件"},{"type":"link","attrs":{"href":"https:\/\/www.graalvm.org\/java-on-truffle\/","title":"","type":null},"content":[{"type":"text","text":"Java on Truffle"}]},{"type":"text","text":",該組件提供了一個用Java開發的Java虛擬機(JVM)。GraalVM本身是一個多語言虛擬機,提供了一個共享的運行時來執行用Java、Python和JavaScript等多種語言開發的應用程序。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在這個版本發佈之前,在想在GraalVM上運行Java應用程序,可以使用帶有GraalVM即時編譯器(JIT)的Java HotSpot VM或者使用GraalVM原生鏡像將代碼編譯成原生可執行文件。新版本的Java on Truffle(一個基於"},{"type":"link","attrs":{"href":"https:\/\/www.graalvm.org\/graalvm-as-a-platform\/language-implementation-framework\/","title":"","type":null},"content":[{"type":"text","text":"Truffle框架"}]},{"type":"text","text":"、使用Java開發的JVM)爲運行Java應用程序提供了額外的選項。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java on Truffle(代號Espresso)可以通過GraalVM更新程序gu來安裝。gu是一個包管理器,用於下載和安裝GraalVM核心發行版中不包含的包。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"gu install espresso\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要通過Java on Truffle來運行Java應用程序,需要向Java命令傳遞-truffle選項。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"plain"},"content":[{"type":"text","text":"java -truffle -jar awesomeApp.jar\n"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java on Truffle是一種小型JVM,提供了JVM的所有核心組件,比如字節碼解釋器、Java本地接口(JNI)和Java調試線協議(JDWP)。它實現了Java運行時環境庫(libjvm.so) API,重用了所有必需的GraalVM JAR包和原生庫。就像傳統的JVM一樣,Java on Truffle也支持運行其他基於JVM的語言,比如Kotlin。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/9f\/9f172e848404dd994c6b70b2f0b1fb13.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖片來源:"},{"type":"link","attrs":{"href":"https:\/\/miro.medium.com\/max\/1400\/1*fWeivN_3IbdjJ9GkJXxHzA.png","title":"","type":null},"content":[{"type":"text","text":"GraalVM博客"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲它是用Java實現的,並且能夠運行Java,所以Java on Truffle本質上是自託管的Java或Java on Java。這爲研究和創新JVM提供了有趣的機會,因爲Java開發人員可以閱讀和理解JVM源代碼,並對其加以改進。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面是Java on Truffle提供的一些值得注意的特性和好處:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在調試會話期間,利用增強的HotSwap功能在運行時修改方法、Lambda和類的訪問修飾符。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"能夠運行不同於主機JVM的Java字節碼版本。例如,可以通過"},{"type":"link","attrs":{"href":"https:\/\/www.graalvm.org\/sdk\/javadoc\/org\/graalvm\/polyglot\/package-summary.html","title":"","type":null},"content":[{"type":"text","text":"Polyglot API"}]},{"type":"text","text":"在Java 11應用程序中調用Java 8的庫。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"將宿主JVM和在Truffle上運行的Java應用程序隔離,運行不是很可信的訪客代碼。在這裏,“宿主”和“訪客”用來區分執行Java的不同的層。Java on Truffle是訪客層。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java應用程序可以與JavaScript和Python等非JVM語言直接互操作,並在相同的內存空間中來回傳遞數據。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以利用Truffle框架提供的標準工具。例如,可以使用CPU採樣器分析工具來查看Java應用程序的哪個部分佔用更多的CPU時間。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"構建預先編譯(AOT)的Java原生鏡像,動態加載和運行Java代碼,使用Espresso的JIT編譯器。例如,CI\/CD應用程序(如Jenkins)可以被構建成原生鏡像,同時又可以動態加載任意插件。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/04\/04f9d9f030ca4da273875a0d4b8d1e54.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖片來源:"},{"type":"link","attrs":{"href":"https:\/\/miro.medium.com\/max\/1400\/1*c2VdWWLv_xc0jH1OVnuObw.png","title":"","type":null},"content":[{"type":"text","text":"GraalVM博客"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"GraalVM提供了一組"},{"type":"link","attrs":{"href":"https:\/\/www.graalvm.org\/reference-manual\/java-on-truffle\/demos\/","title":"","type":null},"content":[{"type":"text","text":"演示應用程序"}]},{"type":"text","text":"來展示這些特性和好處。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"需要注意的是,Java on Truffle是一個實驗性組件,還不能用於生產環境中。Java on Truffle當前版本的峯值性能比常規JVM慢了好幾倍,但在後續版本中將得到改進。下面是一些值得注意的Java on Truffle限制,這些限制可能會在GraalVM的未來版本中得到解決:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"沒有實現JVM工具接口(JVMTI)。不支持對應的“-agentlib”和“-agentpath”虛擬機選項。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"沒有實現java.lang.instrument接口。不支持對應的“-javaagent”虛擬機選項。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實現了部分Java管理擴展(JMX),有些方法可能只返回部分數據。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了Java on Truffle之外,新版本還增強了其他功能。例如,現在允許在原生鏡像二進制文件中使用Java序列化。在構建原生鏡像之前,可以使用javaagent自動生成序列化配置。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"新版本的GraalVM還爲Ruby、Python和LLVM發行版提供了一些兼容性和運行時改進。GraalVM的WebAssembly語言實現("},{"type":"link","attrs":{"href":"https:\/\/www.graalvm.org\/reference-manual\/wasm\/","title":"","type":null},"content":[{"type":"text","text":"GraalWasm"}]},{"type":"text","text":")也得到了優化,提升了預熱時間和WebAssembly的整體解釋峯值性能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"GraalVM社區版的Java版本更新了,基於OpenJDK 1.8.0_282和OpenJDK 11.0.10。GraalVM的Node.js版已經更新到12.20.1。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在工具方面,GraalVM 21.0附帶了一個改進的gu工具,可以更簡單地進行版本更新。Visual Studio Code的"},{"type":"link","attrs":{"href":"https:\/\/medium.com\/graalvm\/graalvm-21-0-vs-code-extensions-released-ab196354faeb","title":"","type":null},"content":[{"type":"text","text":"GraalVM擴展包"}]},{"type":"text","text":"也已經發布,幫助開發和調試基於GraalVM的應用程序。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文鏈接"},{"type":"text","text":":"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/www.infoq.com\/news\/2021\/01\/graalvm-21-jvm-java\/","title":"","type":null},"content":[{"type":"text","text":"GraalVM 21.0 Introduces a JVM Written in Java"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章