什么机制JVM使用来阻止停止在世界的暂停期间线程(What mechanism JVM use to

2019-09-03 07:06发布

我听说在接受记者采访时这个问题,并不能提供一个答案。 后来我搜索通互联网,仍然没有找到答案。 谁能告诉我怎么JVM的垃圾收集,以及如何重新运行它们时停止在世界暂停期间停止线程。

Answer 1:

对于热点和OpenJDK的至少JVM使用安全点停止应用程序在每个线程流,无论是在JIT编译的代码或改变字节码映射解释代码介绍(见这个帖子由阿列克谢Ragozin有详细介绍)。

另见这个答案由吉尔·拉登为什么有停止的世界暂停交易时safepointing可以是一个额外的问题。


这里有更多的细节(我理解他们,我不自称是专家)对热点/ OpenJDK的的safepointing机制(见例如safepoint.cpp ,线154),基于上述资源,并可能在一些克利夫文章请点击Azul系统博客(这似乎已经从网站上消失)。

到达还原点

JVM需要获得来自应用程序的流量控制,所以它取决于线程的当前状态:

  • 阻止

    在JVM已经有一个线程的控制。

  • 运行解释代码

    解释器进入的模式(通过交换它的调度表),其中每个字节码的评估将由一个还原点检查之前。

  • 运行本地代码 (JNI)

    JNI代码放在一个还原点运行,可以继续运行,除非它回调到Java或调用一些特定的JVM方法,此时可以停止,以防止离开还原点(感谢Nitsan的意见)。

  • 运行编译的代码

    在JVM使得特定内存页面(该还原点投票页面)不可读的,这使得该页面(插入由JIT编译器编译后的代码)的定期读取失败,去一个JVM处理。

  • 运行在虚拟机或(也在VM)过渡状态

    该流程经过在某些时候还原点检查无论如何,所以虚拟机等待它。

停在还原点

一旦线程处于还原点,由JVM中,JVM简单地从离开块它控制。 当所有的线程都已经停止(即世界已停止),JVM可以做垃圾回收,然后释放所有恢复执行线程。

对于更多的细节,你可以去阅读上safepoints博客文章由Nitsan Wakart在此期间(其本身具有更引用)写的。



文章来源: What mechanism JVM use to block threads during stop-the-world pause