JVM可以内联本机方法吗?

en4*_*4bz 2 java x86 jit jvm

我写了一个小的静态JNI函数,它只有5个指令长.JVM是否可以将此代码内联到一个经常调用它的方法体中,或者它总是call在JITed方法中生成一条指令?

例如:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能为JVM内联的代码func进入doLoop,否则将只是其编译为call func

apa*_*gin 11

不,JVM基本上不行.

本机函数的实现是二进制黑盒子; JVM唯一知道的是入口点地址.

本机代码不由虚拟机管理,不能在Java方法的上下文中执行.JVM将"in_java"状态的线程与"in_native"线程区分开来.例如,本机线程不会在JVM安全点停止,原因很简单,因为JVM无法执行此操作.

此外,本机方法调用不是那么简单的操作.需要一个特殊的程序来解决JNI呼叫的所有方面.