我编写了一个小型静态 JNI 函数,只有 5 条指令长。 JVM 是否可以将此代码内联到频繁调用它的方法主体中,或者它总是在 JIT 方法中生成 call
指令?
例如:
public class SomeClass {
private static native long func();
public void doLoop() {
for(int i = 0; i < 0xFFFFFF; i++) {
func();
}
}
public static void main(String[] args) {
for(int i = 0; i < 0xFFFFFF; i++) {
doLoop();
}
}
}
JVM 是否可以将 func
的代码内联到 doLoop
中,或者将其编译为 call func
最佳答案
不,JVM基本上不能。
原生函数的实现是一个二进制黑盒; JVM 唯一知道的就是入口点地址。
native 代码不受虚拟机管理,无法在 Java 方法的上下文中执行。 JVM 区分 'in_java' 状态的线程和 'in_native' 状态的线程。例如, native 线程不会在 JVM 安全点停止,只是因为 JVM 无法做到这一点。
而且,调用native方法并不是那么简单的操作。 A special procedure需要解决 JNI 调用的所有方面。
关于java - JVM 可以内联 native 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32722471/