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中没有相应的预取本机方法声明。