当前位置: 首页 > 面试题库 >

JVM / JAVA中的预取指令

邹野
2023-03-14
问题内容

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


问题答案:

一件有趣的事是Hotspot JVM实际上 确实支持 预取!
它把Unsafe.prefetchRead()Unsafe.prefetchWrite()方法作为内部函数,并将其编译成相应的CPU指令。

不幸的是,sun.misc.Unsafe没有声明这种方法。但是,如果将以下方法添加到Unsafe.java中,对其进行重新编译并替换rt.jar中的Unsafe.class(或仅添加-Xbootclasspath/pJVM参数),则可以在应用程序中使用预取内在函数。

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



 类似资料:
  • 问题内容: 我正在阅读此博客文章。 作者正在谈论在多线程环境中打破in 。 有了: 变成: 作者说,我引用: “我在这里所做的是添加一个附加读取: 哈希的第二次读取,在返回之前 。听起来很奇怪,而且不太可能发生,第一次读取可以返回正确计算出的哈希值,内存模型允许第二次读取返回0!这是允许的,因为该模型允许对操作进行广泛的重新排序。第二次读取实际上可以在代码中移动,以便处理器在第一次读取之前进行处理

  • 我猜这是一个基本的问题,但是为什么没有sload指令呢?为什么你可以加载除了short之外的所有原语?(有saload,但仍然……) 对于:

  • 问题内容: 如果我正在设计一个关于排序算法的测试,是否可以这样做以避免JVM预热?谢谢! 问题答案: JVM预热通常是指JVM查找代码的这些部分并将热点和JIT花费的时间。如果您运行实际测试几百次(我相信实际上是几千次),那么您应该相当不错。 但是,您应该知道,即使这样做,也无法保证。您必须对特定的JVM进行试验,以弄清关键部分被JIT之前必须要做的工作等等。 在这个小案例研究中,JIT编译在17

  • 我参考了下面的oracle jvm文档 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.pop 弹出操作弹出操作数堆栈顶部的值 总体安排 pop表格pop=87(0x57) 操作堆栈...,值→ ... 说明从操作数堆栈中弹出顶部值。 除非值是1类计算类型的值(§2.11.1),否则不得使用pop指令。

  • 所以我和一位面试官(你的标准人力资源经理)谈了他们在面试中真正想要的东西,他提到了一些关于测试JVM指令知识的东西(以及其他很多东西)。 我不知道那是什么,但我以为他说的是字节码指令。 我做了一些研究,似乎在“JVM指令”上找不到任何东西,我只找到了字节码指令的引用,我已经知道了字节码指令。 例如:http://docs.oracle.com/javase/specs/jvms/se7/html/