GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
应用实时监控服务-应用监控,每月50GB免费额度
简介: 阿里巴巴是 GraalVM 全球顾问委员会的唯一中国代表,阿里云程序语言与编译器团队和可观测团队合作实现了 GraalVM 应用的无侵入可观测能力,并在 ARMS 平台上线了该功能。目前在 GraalVM 24 中发布的是支持 Java agent 的第一步,其余能力将在 GraalVM 的后续版本中陆续发布。

作者:林子熠、饶子昊

image.png


2025 年 3 月 18 日 Oracle 双箭齐发,正式发布了 JDK 24 和 GraalVM 24,带来了众多新特性。


JDK 24 在性能和安全性方面均有改进特性列表链接见下,其中较大的一处改动是在 JDK 中用新的 Class-File API 取代了 ASM 接口,使 Java agent 在动态修改 Java 字节码时更加方便快捷。与之相呼应,GraalVM 24 在提升运行时性能、降低 native image 制品大小、提升调试体验等各方面的改进和提升之外特性列表链接见下,也迈出了在 native image 中静态化支持 Java agent 插桩的第一步。这就是在发布中提到的 Premain Support for Java Agents 新特性,即支持 Java agent 的 premain 机制。


这是由阿里巴巴贡献到 GraalVM 社区的新特性。阿里巴巴是 GraalVM 全球顾问委员会的唯一中国代表,阿里云程序语言与编译器团队和可观测团队合作实现了 GraalVM 应用的无侵入可观测能力,并在 ARMS 平台上线了该功能。目前在 GraalVM 24 中发布的是支持 Java agent 的第一步,其余能力将在 GraalVM 的后续版本中陆续发布。


实现原理


Java agent 是一种动态修改 Java 运行时代码的技术,无需应用程序修改任何内容,由 Java agent 在运行时修改实际要执行的内容,广泛使用于 Java 应用监控领域。Java 应用在上线后一般都会接入以 Java agent 为核心的可观测平台,监测运行时行为。


Java agent 的实现有两点基础,GraalVM 都不具备:


1. JVM 的 premain 机制。如果希望应用在运行时自始至终用到的都是经过变换的类,那么就需要在应用正式开始前就把修改类的需求告诉 JVM,然后在首次加载类时进行修改。Java 规范要求 agent 必须要提供名为 premain 的函数,在里面实现注册变换、选项解析、上下文环境初始化等工作。JVM 则提供了相应的执行入口,保证在执行主函数之前会调用各个 agent 的 premain 函数。但是在 GraalVM 的运行时中并没有设计过该机制,所以 agent 就不会有被调用的机会。


2. 对 Java 的字节码进行变换。修改字节码,改变目标的运行时行为。在 JDK24 之前基于 ASM 接口修改,在 JDK24 之后基于 Class-File 接口。GraalVM 将 Java 应用编译为 native 应用后不再保留字节码,因此失去了可以修改的目标,而且 native 应用本身也不支持动态修改。


GraalVM 因为不能支持 Java agent 而失去了可观测能力,这一功能缺失阻碍了很多用户适配 GraalVM。


我们在 GraalVM 上实现对 Java agent 的支持就是解决了以上两个问题:


首先,在 GraalVM 的编译时识别用户的 premain 函数,将它们加入编译队列,然后注册到运行时的 premain 入口。这样编译制品 native image 就会在运行时成功找到 premain 函数,然后执行其中的业务逻辑。这次在 GraalVM 24 中发布的就是这部分功能。


其次,将 Java agent 的类转换动作从运行时提前到编译时。因为基于 premain 的 agent 即使在 JVM 中,也是在首次加载目标类的时候对其进行变换,然后将变换好的结果返回给类加载器的。使用者首次见到的类就是变换后的,那么对于使用者来说,编译时变换和运行时变换就是等价的。所以我们只要将 agent 转换好的类编译进 native image 就可以了。那么问题就转换为如何在编译时获得 agent 变换后的类。


关于这个问题,我们的实现思路是先让挂载 agent 的 Java 应用执行一次,在此过程中把经过 agent 转换的类转储到磁盘,然后在编译时使用这些类。


通过ARMS对GraaIVM应用进行观测


目前,阿里云应用实时监控服务平台 ARMS(复制至浏览器打开或文末阅读原文直达:https://www.aliyun.com/product/arms已经基于上述方案,完成了相关能力支持,具体使用 ARMS 对 GraalVM 应用进行可观测的方法请参考 ARMS 官方文档(链接见文末)


当完成静态编译后,相关可执行 Native Image 文件中就包含了 ARMS 可观测 Java Agent 的代码。执行按照正常 GraalVM 应用部署运行方式进行运行即可,以下是其在 ARMS 控制台上的部分可观测数据采集效果:


GraalVM 应用指标数据采集效果


image.png


GraalVM 应用调用链数据采集效果


如下图是一个通过 Spring Schedule 发起定时任务调用 Restful 接口,然后通过 HttpClient 对外进行调用的示例:


image.png


性能效果


我们基于上述方案,也对 GraalVM 应用在启动速度和运行时内存占用进行了一些测试验证,发现 Java 应用基于 GraalVM 静态编译后,不仅可以正常使用开箱即用的可观测能力,运行时内存占用和启动延时仍然有巨大的优化效果(以下测试在 32 vCPU/64 GiB/5 Mbps 环境中完成)。


image.png


总结


GraaLVM 24 正式发布了由阿里巴巴贡献的 premain 机制,拉开了对 Java agent 的静态编译支持大幕。尽管 GraalVM 社区对无侵入式可观测的支持还处于早期阶段,但阿里云 ARMS 平台已经上线了完整的静态编译可观测能力支持。欢迎对上述相关产品能力和技术方案感兴趣的读者试用 ARMS,希望获取相关资料和做进一步交流探讨的读者请加钉钉群(群号: 80805000690)。


相关链接(复制链接至浏览器打开)


1.GraalVM 24 特性列表链接:

https://www.graalvm.org/release-notes/JDK_24/


2.JDK 24 特性列表链接:

https://jdk.java.net/24/release-notes


3.Class-File API:

https://openjdk.org/jeps/484


4.GraalVM 应用接入 ARMS 链接:

https://help.aliyun.com/zh/arms/application-monitoring/use-cases/connect-graalvm-applications-to-arms


5.使用 ARMS 对 GraalVM 应用进行可观测方法:

https://help.aliyun.com/zh/arms/application-monitoring/use-cases/connect-graalvm-applications-to-arms

相关文章
|
2月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
Java API 开发者
89 0
|
4月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
210 1
|
4月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
504 1
|
4月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
125 0
|
4月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
194 1
|
4月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
253 1
|
4月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
146 3