prefetch instruction in JVM/JAVA

孤人 提交于 2019-11-28 18:57:58

One interesting thing is that Hotspot JVM actually does support prefetch!
It treats Unsafe.prefetchRead() and Unsafe.prefetchWrite() methods as intrinsics and compiles them into corresponding CPU instructions.

Unfortunately, sun.misc.Unsafe does not declare such methods. But, if you add the following methods to Unsafe.java, recompile it and replace Unsafe.class inside rt.jar (or just add -Xbootclasspath/p JVM argument) you would be able to use prefetch intrinsics in your application.

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);

I doubt this could help much in real applications, but if you'd like to play with it, I can provide more details.
Here is a compiled patch to JDK 8 that enables prefetch methods: download

Usage example:

long[] array = new long[100*1024*1024];
// ...
sun.misc.Unsafe.prefetchReadStatic(array, 50*1024*1024);

UPDATE

Unsafe.prefetch* intrinsics are completely removed in JDK 9:

Note read/write prefetch support was implemented as an experiment to see if JDK library code could use it for performance advantages. However, the results of the experiment did not indicate this was worthwhile. As a consequence there are no corresponding prefetch native method declarations in sun.misc.Unsafe.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!