GraalVM之前不能支持Java Agent主要面临两个核心技术难题:
- 缺少premain机制:Java规范要求agent必须提供名为premain的函数,在应用主函数执行前完成变换注册、选项解析和上下文初始化等工作。JVM提供了相应的执行入口保证premain在main之前被调用,但GraalVM的运行时中从未设计过这一机制,导致agent没有被调用的机会。
- 无法进行字节码变换:Java agent的核心功能是在运行时修改Java字节码来改变目标行为。然而GraalVM将Java应用编译为native应用后不再保留字节码,丧失了可以修改的目标,且native应用本身也不支持动态修改。
这两个问题导致GraalVM应用无法使用基于Java agent的可观测平台,阻碍了很多用户从JVM迁移到GraalVM。阿里巴巴的解决方案是在编译时处理premain注册,并将agent的类转换动作从运行时提前到编译时来绕过这些限制。