JVM / JAVA中的预取指令
问题内容:
是否有Java语言或JVM中的任何软件预取指令,例如__builtin_prefetch(在GCC中可用)
问题答案:
一件有趣的事是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);
更新
Unsafe.prefetch*
JDK 9
中完全删除了内在函数:
注意,将读取/写入预取支持作为实验来实现,以查看JDK库代码是否可以将其用于性能上。但是,实验结果并未表明这是值得的。因此,sun.misc.Unsafe中没有相应的预取本机方法声明。