前面我们提到了内置方法是在编译器实现的。
在Hotspot VM中其实有3中编译器。
第一种就是javac将java源代码编译成为字节码。
在这一层,只有一些math方法和bootstrapping的MethodHandle是在这一层实现的。
第二种就是在JIT的Client Compiler (C1)。
第三种就是在JIT的Server Compiler (C2)。
举一个例子,我们看一下java.lang.System.currentTimeMillis()方法:
@HotSpotIntrinsicCandidatepublic static native long currentTimeMillis();
JDK源码使用了HotSpotIntrinsicCandidate注解。这个注解只是表示该方法可能会被用于Intrinsic,而并不意味着一定使用Intrinsic。
这个方法在Interpreter级别是没有intrinsified。因为这是一个native方法,所以会通过JNI调用底层的C++实现。
而在C1和C2级别,会使用intrinsified, 直接调用os::javaTimeMillis()。
好处就是减少了JNI的使用,提升效率。
好了问题来了,我们可以自己实现intrinsified方法吗?
答案是可以,不过需要修改底层的JVM实现。
这里有两个具体的例子,感兴趣的大家可以自行研究。
C1级别修改(First cut: C1 Class.isInstance intrinsic):
https://gist.github.com/rednaxelafx/2830194
C2级别修改(Example (XS) of adding an intrinsic method to HotSpot C2. Patch against HS20-b12):
https://gist.github.com/rednaxelafx/1986224