【发布时间】:2014-05-06 13:12:19
【问题描述】:
是否有任何 Java 语言或 JVM 中的软件预取指令,例如 GCC 中可用的__builtin_prefetch
【问题讨论】:
-
你需要这个做什么?顺便说一句,这似乎是相关的,可能会提供答案:stackoverflow.com/questions/10056407/…
是否有任何 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 的已编译补丁,可启用预取方法:download
使用示例:
long[] array = new long[100*1024*1024];
// ...
sun.misc.Unsafe.prefetchReadStatic(array, 50*1024*1024);
更新
Unsafe.prefetch* 内在函数在 JDK 9 中完全是 removed:
注意读/写预取支持是作为实验实现的 看看 JDK 库代码是否可以使用它来获得性能优势。 但是,实验结果并不表明这是 值得。因此没有相应的预取 sun.misc.Unsafe 中的本机方法声明。
【讨论】:
rt.jar(替换 Unsafe.class)或添加 modified Unsafe.class 以使用 -Xbootclasspath/p 标志引导类路径。
-XX:AllocatePrefetchLines JVM选项吗?它是否启用预取?
AllocatePrefetch* 选项都与在Java Heap 中分配对象后立即发出prefetch 指令有关。这由默认为 ON 的 -XX:AllocatePrefetchStyle 选项控制。 AllocatePrefetchLines 和 AllocateInstancePrefetchLines 分别控制在分配对象地址之后预取多远(缓存行数),用于数组或对象。