【问题标题】:prefetch instruction in JVM/JAVAJVM/JAVA 中的预取指令
【发布时间】:2014-05-06 13:12:19
【问题描述】:

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

【问题讨论】:

标签: java jvm jit


【解决方案1】:

一个有趣的事情是 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 中的本机方法声明。

【讨论】:

  • 好。 1)根据java-gaming.org/index.php?topic=27010.0,它们存在于热点内在。所以不需要重新编译任何东西。我说的对吗?
  • 是的,Hotspot JVM 已经知道内在函数,但它们应该在类库中声明。因此,您需要修补 rt.jar(替换 Unsafe.class)或添加 modified Unsafe.class 以使用 -Xbootclasspath/p 标志引导类路径。
  • 太棒了!非常感谢你分享这个。
  • 你能评论-XX:AllocatePrefetchLines JVM选项吗?它是否启用预取?
  • @neverov 所有AllocatePrefetch* 选项都与在Java Heap 中分配对象后立即发出prefetch 指令有关。这由默认为 ON 的 -XX:AllocatePrefetchStyle 选项控制。 AllocatePrefetchLinesAllocateInstancePrefetchLines 分别控制在分配对象地址之后预取多远(缓存行数),用于数组或对象。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 2011-03-08
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多