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的编译补丁,它支持预取方法: 下载

用法示例:

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

UPDATE

在JDK 9中完全删除了Unsafe.prefetch* intrinsics:

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