我们如何检查 JVM 何时采用未来保证的 SafePoint?

How can we check when future guaranteed SafePoint is to be taken in JVM?

除了 GC Stop-The-World 安全点之外,JVM 可以在安全点中停止 java 应用程序的原因有很多。评估安全点停止的原因之一是保证安全点间隔。

我们可以预测何时采取保证安全点停止吗?或者如果它是最近拍摄的?

为什么我需要它?我在一个线程中进行共享内存文件的预处理。如果在评估安全点停止时发生预接触,它会使到达安全点的时间更长。如果我只能等到安全点评估之后。

清理安全点(又名“保证安全点”)仅在有一些清理工作要做时发生,例如JVM 需要放气空闲监视器或清除内联缓存缓冲区。没有办法预测这样的安全点。但好消息是你不需要。

那么,最初的问题是为了防止在预触摸内存映射文件时出现长时间的安全点停顿,对吗?解决方案是以完全不受安全点影响的方式对其进行预触摸。

当您调用 JNI 方法时,线程会切换到 in_native 状态。 JVM 不会等待处于此状态的线程。所以,只需将预触摸移动到本地方法,它不会影响安全点,无论它们是否发生。

一种选择是使用常规 FileChannel API。例如。不是访问 Mapped ByteBuffer,而是通过从 FileChannel 读取(或写入)1 个字节进行预触摸。 I/O 将发生在不受安全点约束的本机方法中。