GraalVm的反射配置辅助工具agentlib配置及使用
作者:kl 时间:2022-05-08 16:42:46
前言
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环境后才行
来源:http://www.kailing.pub/article/index/arcid/302.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
JVM教程之内存管理和垃圾回收(三)
![](https://img.aspxhome.com/file/2023/2/59352_0s.jpg)
spring声明式事务 @Transactional 不回滚的多种情况以及解决方案
![](https://img.aspxhome.com/file/2023/3/62143_0s.jpg)
mybatis多表查询的实现(xml方式)
![](https://img.aspxhome.com/file/2023/5/79235_0s.png)
SpringMVC 数据校验方法(必看篇)
Java编程语言特性和优势
![](https://img.aspxhome.com/file/2023/4/103974_0s.png)
Java Swing JTextArea文本区域的实现示例
![](https://img.aspxhome.com/file/2023/6/58606_0s.png)
Springboot引入多个yml方法(多种方案)
![](https://img.aspxhome.com/file/2023/7/88597_0s.png)
Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端
![](https://img.aspxhome.com/file/2023/3/57693_0s.png)
解析Tars-Java客户端源码
![](https://img.aspxhome.com/file/2023/7/89587_0s.jpg)
Idea热加载插件JRebel激活以及使用教程
![](https://img.aspxhome.com/file/2023/5/66185_0s.jpg)
Swagger及knife4j的基本使用详解
聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的
一文带你学会Spring JDBC的使用
![](https://img.aspxhome.com/file/2023/7/60377_0s.jpg)
C#简单实现SNMP的方法
SrpingDruid数据源加密数据库密码的示例代码
![](https://img.aspxhome.com/file/2023/1/63021_0s.png)
Android Studio下载与安装简易教程
![](https://img.aspxhome.com/file/2023/6/93276_0s.png)
JSON序列化Redis读取出错问题解决方案
Java项目开发命名规范(动力节点Java学院整理)
IDEA Ui设计器JFormDesigner 永久激活插件+注册机(亲测一直在用)
![](https://img.aspxhome.com/file/2023/3/76273_0s.jpg)
java微信支付接入流程详解
![](https://img.aspxhome.com/file/2023/2/82992_0s.png)