首页 文章

JVM / JAVA中的预取指令

提问于
浏览
9

是否有任何Java语言或JVM中的软件预取指令,如GCC中提供的__builtin_prefetch

1 回答

  • 27

    一个有趣的事情是Hotspot JVM实际上是 does support 预取!
    它将 Unsafe.prefetchRead()Unsafe.prefetchWrite() 方法视为内在函数,并将它们编译为相应的CPU指令 .

    不幸的是, sun.misc.Unsafe 没有声明这样的方法 . 但是,如果您将以下方法添加到Unsafe.java,重新编译它并替换rt.jar中的Unsafe.class(或者只是添加 -Xbootclasspath/p JVM参数),您就可以在应用程序中使用预取内在函数 .

    public native void prefetchRead(Object o, long offset);
    public native void prefetchWrite(Object o, long offset);
    public static native void prefetchReadStatic(Object o, long offset);
    public static native void prefetchWriteStatic(Object o, long offset);
    

    我怀疑这对实际应用程序有多大帮助,但如果你想玩它,我可以提供更多细节 .
    以下是JDK 8的编译补丁,它启用了预取方法:download

    用法示例:

    long[] array = new long[100*1024*1024];
    // ...
    sun.misc.Unsafe.prefetchReadStatic(array, 50*1024*1024);
    

    UPDATE

    Unsafe.prefetch* 内在函数在JDK 9中完全是removed

    注意读/写预取支持是作为实验来实现的,以查看JDK库代码是否可以将其用于性能优势 . 然而,实验结果并未表明这是值得的 . 因此,sun.misc.Unsafe中没有相应的预取本机方法声明 .

相关问题