java - JVM 可以内联 native 方法吗?

标签 java x86 jvm jit

我编写了一个小型静态 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/

相关文章:

java - 图像未显示在 java 框架中

delphi - Delphi 的 x86 代码生成器框架

java - 从 C 读取和解释 JVM 内存

apache-spark - spark.executor.memoryOverhead 和 spark.memory.offHeap.size 的区别

java - 为什么字节码可能比 native 代码运行得更快

java - Java发送图片到浏览器的方法

java - 如何递归获取最后一个对象属性

java - 如何分析下面代码的增长?

c++ - MSVC : Invalid memcpy optimization?

x86 - CPU 寄存器内的字节顺序