是否有Java语言或JVM中的任何软件预取指令,如GCC中提供的__builtin_prefetch
答案 0 :(得分:27)
有趣的是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);
<强>更新强>
JDK 9中 Unsafe.prefetch*
内在函数完全是removed:
注意读/写预取支持是作为实验实现的 看看JDK库代码是否可以将它用于性能优势。 但是,实验结果并未表明这一点 值得的。因此,没有相应的预取 sun.misc.Unsafe中的本机方法声明。