jvmci是做什么的:
获取java生成的字节码,可以让开发者自行实现一个编译器(比如将字节码转换为机器码)。
需要关注的三个类:
JVMCIServiceLocator:当您需要使用JVMCI提供的服务时,可以使用JVMCIServiceLocator类来定位这些服务。
HotSpotJVMCICompilerFactory:创建JIT编译器,该编译器可以编译JVMCI提供的服务。
JVMCICompiler:主要是将字节码转换为机器码
graalvm中:
graalvm把jvmci对外的方法封装了一遍,可以在该目录下找到对应的类:
$ graal/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler
类对应的方法应该都是会经过compileMethod
参考demo:
https://github.com/IAmFunkyFrog/JVMCICompilerInsertExamples/tree/master/example3
替换一下Main.java (因为该demo中只有热点代码才会触发到compileMethod),可能demo使用的jdk版本是9,判断是否是热点代码的方式和我本地的不太一样,或者是机器不同?如果无法触发可以把for循环的次数加大。
public class Main
{
public static int add(int x, int y) {
return x + y;
}
public static void main(String[] args) {
int lastSum = 0;
for (int i = 0; i < 100000; i++) {
lastSum = lastSum = add(1, 2);
}
System.out.println("Sum from 0 to 4999: " + lastSum);
}
}
后续内容可通过知识星球查看:
第五:通过启动参数学习jvm优化相关的命令
第六:espresso模块
第七:Graph
第八:AnalysisUniverse与HostedUniverse
第九:如何使用ide debugger graal源码