GraalVm的反射配置輔助工具agentlib配置及使用

前言

Graalvm通過靜態分析提前編譯來為Java應用程序構建高度優化的本機可執行文件,這就需要在編譯時就知道所有的程序類型,而java中的反射、動態代理等功能,在編譯時不確定具體的類型,所以在使用GraalVm構建native image前需要通過配置列出反射可見的所有類型。反射的配置是一個json格式的文件。為瞭簡化這種反射的配置,GraalVm提供agentlib工具,來輔助生成這個配置文件

Reflection配置文檔:https://github.com/oracle/REFLECTION.md

agetnlib文檔:https://www.graalvm.org/docs/Native-Image/user/CONFIGURE

關於agentlib工具

為瞭更方便地準備這些配置文件,GraalVM提供瞭一個代理,該代理可以跟蹤常規Java VM上執行動態功能的所有使用情況。可以在GraalVM的 java命令的命令行上啟用它,如:

./java -agentlib:native-image-agent=config-output-dir=/home/kl/graal/data/ -jar /home/kl/graal/app/kk-risk-model-0.0.1-runner.jar

config-output-dir配置好配置的輸出目錄,默認情況下,配置文件生成將在jvm停止後輸出,也可以通過添加配置,定期輸出,如

  • config-write-period-secs:按照此配置中的指定,每隔幾秒鐘執行一次定期寫入。僅支持大於零的整數值。
  • config-write-initial-delay-secs:第一次寫入的秒數。僅支持大於或等於零的整數值。僅當config-write-period-secs大於零時啟用。

每個配置間使用逗號分隔,如:

./java -agentlib:native-image-agent=config-output-dir=/home/kl/graal/data/,config-write-period-secs=60,config-write-initial-delay-secs=5 -jar /home/kl/graal/app/kk-risk-model-0.0.1-runner.jar

在執行期間,代理與Java VM交互以攔截所有查找類,方法,字段,資源或請求代理訪問的調用。然後,代理生成的文件jni-config.json,reflect-config.json,proxy-config.json、resource-config.json在指定的目錄輸出。生成的文件是JSON格式的獨立配置文件,其中包含所有攔截的動態訪問。

在使用agentlib生成配置時,建議將應用的測試用例全部跑一邊,讓應用覆蓋到所有的業務接口,不然,生成的配置可能覆蓋不到所有的反射類

配置文件使用

通過將生成的配置文件放置在項目的resources/META-INF/native-image/類路徑上的目錄中使其生效,如果在quarkus中使用,還可以通過添加如下的配置參數使配置生效:

quarkus.native.additional-build-args =-H:ResourceConfigurationFiles=resources-config.json

第一種方案是GraalVm提供的默認的配置加載路徑,第二種方式是Quarkus提供的配置加載方式,所有在quarkus中使用maven構建的話,可以在構建命令中看到你配置的指令,而第一種方案是看不到的,但是也是生效的。

ps:直接下載下來的graalvm sdk不包含如上功能,需要在graalvm的bin目錄下執行gu install native-image安裝好native-image環境後才行

以上就是GraalVm的反射配置輔助工具agentlib的詳細內容,更多關於GraalVm的反射配置輔助工具agentlib的資料請關註WalkonNet其它相關文章!

推薦閱讀: