Stop the world
2018-03-02 14:53
393 查看
我们都知道,在虚拟机进行GC的时候会需要让所用的线程都停止工作,等待他GC完成,那么他是如何保证所有线程全部都停止工作的呢?
只有当所有线程都跑到了安全点,或者进入安全区域之后,才会进行GC
一般安全点设置在以下位置:
方法调用
循环跳转
异常跳转
那么JVM是如何让线程停下的呢?事先会约定一个标志,当需要进行GC的时候,JVM会更改这个标志的值,线程在运行的时候会轮询这个标志,当收到要发生GC信号,他会运行到下一个安全点停下来,等待GC的进行
当然,仅仅用安全点是不够的,有下面一种情况,就是当线程sleep或者阻塞的时候,他根本就不会运行,更谈不上进入安全点了,更不可能让所有的线程去等它,于是引入了安全区域这个概念
只有当所有线程都跑到了安全点,或者进入安全区域之后,才会进行GC
安全点
在安全点,虚拟机会生成OopMap用来记录引用关系(这也是不能在任何地方停下的原因,如果每一条指令都生成OopMap那么效率会非常低,也会占用大量的空间)一般安全点设置在以下位置:
方法调用
循环跳转
异常跳转
那么JVM是如何让线程停下的呢?事先会约定一个标志,当需要进行GC的时候,JVM会更改这个标志的值,线程在运行的时候会轮询这个标志,当收到要发生GC信号,他会运行到下一个安全点停下来,等待GC的进行
当然,仅仅用安全点是不够的,有下面一种情况,就是当线程sleep或者阻塞的时候,他根本就不会运行,更谈不上进入安全点了,更不可能让所有的线程去等它,于是引入了安全区域这个概念
安全区域
当线程进入安全区域,如sleep或者阻塞时,会标志自己已经进入了安全区域,当进行GC的时候,就不用去管它了,当他要离开安全区域是,会先看看JVM已经完成了GC没有,如果没有就等到GC完成之后再离开安全区域相关文章推荐
- JVM进阶(八)——Stop The World
- Stop The World
- JVM进阶(八)——Stop The World
- Sapphire算法:GC Without Stop the World(上)
- JVM GC中Stop the world案例实战
- GC日志中的stop-the-world
- Stop The World(STW)
- JVM进阶(八)——Stop The World
- [Java JVM] Hotspot GC研究- GC安全点 (Safepoint&Stop The World)
- 基于日志理解 cms 原理,为什么remark要stop the world?(理解CMS GC日志.)
- JVM(8)之 Stop The World
- Java Safepoint 与Stop The World
- 最简短精悍的SEO入门介绍 The World’s Shortest (and Probably Most Controversial) Guide to SEO
- The furthest distance in the world (世界上最远的距离)
- 1055. The World's Richest (25)
- The NT Insider:Stop Interrupting Me -- Of PICs and APICs
- [文章摘录]Business Models in the Service World (IT Professional,2009)
- Apple`s Steve Jobs Has Reshaped(重塑) the Tech World: 10 Ways He Did It
- stop-the-world STW
- 1055. The World's Richest (25)