GraalVM中Java Agent的静态编译支持分为两个关键步骤:
第一步:premain机制支持(已在GraalVM 24发布)。在GraalVM编译时识别用户的premain函数,将其加入编译队列,然后注册到运行时的premain入口。这样编译产物native image在运行时就能成功找到premain函数并执行其中的业务逻辑。
第二步:编译时类转换。将Java agent的类转换动作从运行时提前到编译时。核心思路是:基于premain的agent在JVM中也是在首次加载目标类时进行变换,使用者首次见到的就是变换后的类,因此编译时变换和运行时变换对使用者来说是等价的。具体做法是先让挂载agent的Java应用执行一次,在此过程中把经过agent转换的类转储到磁盘,然后在编译时使用这些转换后的类编译进native image。这样就实现了无需运行时字节码变换也能获得agent插桩效果的目标。