我听说在接受记者采访时这个问题,并不能提供一个答案。 后来我搜索通互联网,仍然没有找到答案。 谁能告诉我怎么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