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

标签:GraalVm,反射配置,辅助工具,agentlib
0
投稿

猜你喜欢

  • JVM教程之内存管理和垃圾回收(三)

    2023-11-10 15:49:54
  • spring声明式事务 @Transactional 不回滚的多种情况以及解决方案

    2023-07-06 10:50:33
  • mybatis多表查询的实现(xml方式)

    2021-07-11 01:21:38
  • SpringMVC 数据校验方法(必看篇)

    2023-11-14 21:44:05
  • Java编程语言特性和优势

    2021-11-14 06:54:27
  • Java Swing JTextArea文本区域的实现示例

    2023-10-30 13:40:28
  • Springboot引入多个yml方法(多种方案)

    2023-07-21 21:10:48
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端

    2023-08-19 17:32:33
  • 解析Tars-Java客户端源码

    2023-04-08 01:18:39
  • Idea热加载插件JRebel激活以及使用教程

    2022-03-27 18:16:34
  • Swagger及knife4j的基本使用详解

    2023-02-13 09:34:00
  • 聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    2023-11-16 08:55:50
  • 一文带你学会Spring JDBC的使用

    2023-11-29 17:05:34
  • C#简单实现SNMP的方法

    2021-11-25 18:42:38
  • SrpingDruid数据源加密数据库密码的示例代码

    2021-06-21 03:26:26
  • Android Studio下载与安装简易教程

    2022-05-28 10:25:30
  • JSON序列化Redis读取出错问题解决方案

    2022-10-13 18:57:50
  • Java项目开发命名规范(动力节点Java学院整理)

    2021-06-24 07:16:56
  • IDEA Ui设计器JFormDesigner 永久激活插件+注册机(亲测一直在用)

    2022-10-23 18:44:46
  • java微信支付接入流程详解

    2023-07-28 18:37:46
  • asp之家 软件编程 m.aspxhome.com