自從三年前發布以來,GraalVM已經引起了Java開發的一場革命。GraalVM討論最多的特性之一是原生映像,它基于超前(AOT)編譯。它釋放了本地應用程序的運行時性能,同時保持了熟悉的開發人員生產力和Java生態系統的工具。對Java 感興趣的同學,可以參加Java培訓來獲得知識和技能,以便快速上崗。
原生映像如何工作?
Graal編譯器也作為提前(AOT)編譯器工作,產生本機可執行文件。考慮到Java的動態特性,它到底是如何工作的呢?
與編譯和執行同時發生的 JIT 模式不同,在 AOT 模式下,編譯器在構建期間執行所有編譯,然后再執行。 這里的主要思想是將所有“繁重的”——昂貴的計算——轉移到構建時間,所以它可以完成一次,然后在運行時生成的可執行文件快速啟動并從一開始就準備好,因為一切都是預先計算的并預編譯。
GraalVM 'native-image' 實用程序將 Java 字節碼作為輸入并輸出本機可執行文件。為此,該實用程序在封閉世界假設下對字節碼進行靜態分析。 在分析過程中,該實用程序會查找您的應用程序實際使用的所有代碼,并消除所有不必要的代碼。在java培訓中,有理論知識+實踐項目課程,雙管齊下,學以致用,讓你深入淺出地學習java。
這三個關鍵概念有助于您更好地理解原生映像生成過程:
分析要點。GraalVM本機映像確定哪些Java類、方法和字段在運行時是可訪問的,并且只有那些將被包括在本機可執行文件中。點到點分析從所有的入口點開始,通常是應用程序的主要方法。分析迭代地處理所有可傳遞到達的代碼路徑,直到到達一個固定點,分析結束。這不僅適用于應用程序代碼,也適用于庫和JDK類——將應用程序打包成自包含二進制文件所需的一切。
構建時的初始化。GraalVM原生映像默認在運行時進行類初始化,以確保正確的行為。但是如果原生映像可以證明某些類初始化是安全的,它將在構建時初始化它們。這使得運行時初始化和檢查變得不必要,并提高了性能。
堆快照。原生映像中的堆快照是一個非常有趣的概念。在映像構建過程中,靜態初始化器分配的Java對象以及所有可訪問的對象都被寫入映像堆。這意味著使用預填充的堆,您的應用程序可以更快地啟動。通過java培訓學習,有系統規范的課程和明確清晰的學習路線,讓你快速掌握java更多知識和技能。
與JVM不相上下的最高性能
但是,峰值性能如何呢?當一切都提前編譯時,原生映像如何優化運行時的峰值吞吐量?
我們正在努力確保原生映像提供出色的峰值性能和快速啟動。已經有幾種方法可以提高原生可執行文件的峰值性能:
按配置優化。由于原生映像提前優化和編譯代碼,因此在應用程序運行時,默認情況下它無法訪問運行時分析信息來優化代碼。解決這個問題的一種方法是使用配置文件導向優化(PGO)。使用PGO,開發人員可以運行應用程序,收集分析信息,然后將其反饋到原生映像生成過程中。“原生映像”實用程序使用這些信息,根據應用程序的運行時行為來優化生成的可執行文件的性能。
原生映像中的內存管理。由原生映像生成的可執行文件中的默認垃圾收集器是串行垃圾收集器,這對于具有小堆的微服務來說是最佳的。
原生影像的未來
自第一次公開發布以來,原生圖像已經向前邁出了巨大的步伐。它被Java框架廣泛采用,云供應商提供原生映像作為運行時,并且許多庫使用開箱即用的原生映像。在java培訓中,有系統全面的理論知識和企業級實戰項目,可以讓你真正掌握java知識和技能,更好地進行項目開發。