JVM / JAVA中的预取指令

时间:2014-03-27 13:52:46

标签: java jvm jit

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

1 个答案:

答案 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中的本机方法声明。

相关问题