您的位置:首页 > 运维架构

Stop the world

2018-03-02 14:53 393 查看
我们都知道,在虚拟机进行GC的时候会需要让所用的线程都停止工作,等待他GC完成,那么他是如何保证所有线程全部都停止工作的呢?

只有当所有线程都跑到了安全点,或者进入安全区域之后,才会进行GC

安全点

在安全点,虚拟机会生成OopMap用来记录引用关系(这也是不能在任何地方停下的原因,如果每一条指令都生成OopMap那么效率会非常低,也会占用大量的空间)

一般安全点设置在以下位置:

方法调用

循环跳转

异常跳转

那么JVM是如何让线程停下的呢?事先会约定一个标志,当需要进行GC的时候,JVM会更改这个标志的值,线程在运行的时候会轮询这个标志,当收到要发生GC信号,他会运行到下一个安全点停下来,等待GC的进行

当然,仅仅用安全点是不够的,有下面一种情况,就是当线程sleep或者阻塞的时候,他根本就不会运行,更谈不上进入安全点了,更不可能让所有的线程去等它,于是引入了安全区域这个概念

安全区域

当线程进入安全区域,如sleep或者阻塞时,会标志自己已经进入了安全区域,当进行GC的时候,就不用去管它了,当他要离开安全区域是,会先看看JVM已经完成了GC没有,如果没有就等到GC完成之后再离开安全区域
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息