GraalVM 21.3支援Java 17、Native Image 效能更新等等

banq發表於2021-11-22

今天我們釋出 GraalVM 21.3!它帶來了許多社群期待已久的強大功能,在這篇博文中,我們將討論其中一些最有趣和最有前途的功能。

21.3 是今年的最後一個版本,這意味著 GraalVM 社群版將在接下來的 12 個月內不斷收到更新。因此,如果您正在考慮升級 GraalVM 版本,現在是這樣做的好時機!

下載 GraalVM 21.3 社群

下載 21.3 企業版

除了基於 JDK11 的構建,GraalVM 21.3 也可用於最近釋出的Java 17。這意味著除了 Java 17 的所有強大功能(例如 switch 表示式的模式匹配、密封類、平臺更新等)之外,我們還可以訪問 Java 17 中積累的所有 Java 11+ 功能。

 

編譯器更新

與每個版本一樣,Graal 編譯器更新帶來了新的效能優化並提升了以前的實驗性功能。例如,現在預設啟用非計數迴圈的條帶挖掘優化。通過這種優化,更多的未計數迴圈被轉換為計數迴圈,成為進一步優化的物件,例如向量化和部分展開。對於大量使用非計數迴圈的工作負載,這會帶來高達 15% 的加速。

現在預設情況下還啟用了增強型自動向量化,這在某些工作負載(例如數學密集型 ML 工作負載)上使 GraalVM Enterprise 比 OpenJDK 快 40%。

21.3 中新增的新優化之一是不可行路徑相關優化,旨在消除不可行路徑。

class A { ... }
class B extends A { ... }
if (x > 5) {
    if (y instanceof A) {
        throw Error();
    }
}
loop {
    int foo = <expensive computation>;
    if (x > 10) {
        if (y instanceof B) {
            bar(foo);
        }
    }
}

在條件x > 10 && y instanceof B情況下,將只執行bar(foo);如果是條件x > 5 && y instanceof A則throw Error(),bar則從不會執行。

Graal 現在認識到了這一點,如果foo僅用作bar的引數,則消除對bar的呼叫以及foo的計算。

此版本的 GraalVM 還引入了一個用於改進 Java 程式配置檔案的捕獲和分析的新工具:proftool。它旨在提供有關執行的機器級詳細資訊,以幫助進行 JIT 效能分析。目前,它包含一個 JVMTI 代理,用於捕獲 JVM 生成的所有程式集,一個用於 Linux 效能輸出的解析器,以及一個用於 HotSpot LogCompilation 資訊的解析器。通過將這些元件組合到單個命令列中,效能配置檔案資訊可以歸因於 JIT 程式碼。Profile collection 目前只支援 Linux perf,不過一旦資料被捕獲,就可以在任何地方檢視 Profile。

 

Native Image

21.3為 Native Image引入了條件反射配置。限制反射、JNI、類路徑資源和動態代理物件在映像構建時所需的配置檔案條目可以根據類的可達性設定條件。

例如,要支援反射訪問sun.misc.Unsafe.theUnsafe僅when io.netty.util.internal.PlatformDependent0可達,配置應如下所示:

{
  "condition" : { 
    "typeReachable" : "io.netty.util.internal.PlatformDependent0" 
  },
  "name" : "sun.misc.Unsafe",
  "fields" : [
    { "name" : "theUnsafe" }
  ]
}

這可以實現更精確的配置,從而減少本機可執行檔案的大小。

社群特別期待 Native Image 的另一個更新:正如我們最近的民意調查顯示,開發人員希望看到 Native Image 改進的第一件事是構建時間。

21.3 中的另一個重大更新是對 Java 平臺模組系統的初步支援。例如,您可以從兩個 Java 模組構建映像Image:base-module.jar和app-module.jar,其中模組sample.app 包含主類:

native-image --module-path base-module.jar:app-module.jar --module sample.app

另一個與 Native Image 效能相關的重大更新是序列 GC的新策略,以減少應用程式執行時記憶體佔用。新策略為年輕代啟用了倖存者空間,該功能已存在於程式碼庫中一段時間​​但未啟用。此外,full GC 不再掃描整個映像Image 堆以查詢根指標,而是僅掃描已寫入映像堆的部分。

此版本中的 Native Image 還支援Java 17。除了其他功能外,它還包括用於 JDK 17 的 JDK Flight Recorder (JFR),這是 Red Hat 的貢獻。

 

多語言執行時和嵌入

在此版本中,我們顯著提高了內建 CPU 取樣器工具的可用性和精度。CPU 取樣器適用於所有多語言語言,並作為所有啟動器的內建命令列工具提供。特別是在以下幾個方面進行了改進:

  • 通過使用新的客戶語言安全點機制提高了取樣輸出的精度。預設情況下,除了編譯單元之外,取樣輸出現在還顯示內聯方法。
  • 簡化了預設的取樣直方圖輸出,並新增了— cpusampler.ShowTiers顯示每個優化層的時間花費的選項。
  • 向 CPUSampler 新增了 SVG 火焰圖輸出格式。要啟用它,請使用新— cpusampler.Output=flamegraph選項。

....

 

VsCode 

此外,通過GraalVM Tools for Java 擴充套件啟用的VS Code 中的 Native Image 除錯得到了顯著改進。現在您可以將偵錯程式附加到 Native Image 程式並跳過影像“真實”程式碼。將偵錯程式附加到本機可執行檔案是通過向 launch.json 新增配置來完成的。在launch.json檔案的配置完成中選擇:“ Native Image: Attach to Process ”,會生成“ Attach to Native Image ”配置。選擇並執行此配置後,您將看到正在執行的程式列表。

在此版本中,GraalVM Tools for Micronaut Extension新增了對 Kubernetes 的支援:現在您可以直接從 Visual Studio Code在 Kubernetes 叢集中部署、執行和除錯 Micronaut 應用程式。

 

相關文章