Stop the world
2024-06-03 14:13:46
我们都知道,在虚拟机进行GC的时候会需要让所用的线程都停止工作,等待他GC完成,那么他是如何保证所有线程全部都停止工作的呢?
只有当所有线程都跑到了安全点,或者进入安全区域之后,才会进行GC
安全点
在安全点,虚拟机会生成OopMap用来记录引用关系(这也是不能在任何地方停下的原因,如果每一条指令都生成OopMap那么效率会非常低,也会占用大量的空间)
一般安全点设置在以下位置:
- 方法调用
- 循环跳转
- 异常跳转
那么JVM是如何让线程停下的呢?事先会约定一个标志,当需要进行GC的时候,JVM会更改这个标志的值,线程在运行的时候会轮询这个标志,当收到要发生GC信号,他会运行到下一个安全点停下来,等待GC的进行
当然,仅仅用安全点是不够的,有下面一种情况,就是当线程sleep或者阻塞的时候,他根本就不会运行,更谈不上进入安全点了,更不可能让所有的线程去等它,于是引入了安全区域这个概念
安全区域
当线程进入安全区域,如sleep或者阻塞时,会标志自己已经进入了安全区域,当进行GC的时候,就不用去管它了,当他要离开安全区域是,会先看看JVM已经完成了GC没有,如果没有就等到GC完成之后再离开安全区域
最新文章
- GSL库在VC6.0上的配置
- 云计算究竟能帮你具体做些什么事?
- linux怎么卸载yam,linux 基本命令 - osc_foipyam7的个人空间 - OSCHINA - 中文开源技术交流社区...
- Linux自动备份脚本
- 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
- 通信原理matlab实验课程设计,通信原理matlab课程设计报告
- 20. 利用Veeam ONE监控vSphere虚拟化平台(Veeam ONE安装及配置)
- 如何将参数传递给setTimeout()回调?
- docker harbor 域名_Docker镜像仓库Harbor部署
- NYOJ4 - ASCII码排序
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_7_静态同步方法...
- vs2015无法编辑html,连发Lianfa娱乐app -连发Lianfa娱乐appV6.2.84
- 期末复习-选择题整理(湖南大学操作系统课程雨课堂答案即期末题库)
- 未转变者服务器保存红字警告,未转变者3.0怎么设置自己开的服
- 【Linux】putty 出现 inactive
- Mac连接Xbox控制器(手柄)
- C++的strcmp
- 【“探索者”小车】机器人大赛“探索者”全地形小车参赛经验分享
- iPhone手机屏幕尺寸与倍图计算公式(更新至iPhone 14 Plus)
- 【工业大数据】张洁教授现场剖析制造业大数据制造的思考与实践