JVM/JAVA中的预取指令



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

一个有趣的事情是Hotspot JVM实际上支持预取!
它将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);

Unsafe.prefetch*内在特性在JDK 9中被完全移除:

注读/写预取支持是作为实验实现的看看JDK库代码是否可以使用它来获得性能优势。然而,实验结果并没有表明这一点值得的。因此没有相应的预取sun.misc.Unsafe.

中的本机方法声明

最新更新