GC安全点(Safepoint)

  • 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint) ”
  • Safe Point的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择些执行时间较长的指令作为Safe Point, 如方法调用、循环跳转和异常跳转等。

如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?

  • 抢先式中断: (目前没有虚拟机采用了) 首先中断所有线程。如果还有线程不在安全点,就恢复线程,让线程跑到安全点。
  • 主动式中断: 设置一个中断标志,各个线程运行到Safe Point的时候主动轮询这个标志,如果中断标志为真,则将自己进行中断挂起。

安全区域(Safe Region)

Safepoint机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的Safepoint

但是,程序“不执行”的时候呢?例如线程处于Sleep 状态或Blocked状态,这时候线程无法响应JVM的中断请求,“走” 到安全点去中断挂起,JVM也不太可能等待线程被唤醒。对于这种情况,就需要安全区域(Safe Region)来解决。

安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。我们也可以把Safe Region 看做是被扩展了的Safepoint。

程序实际执行时:

  • 1、当用户线程运行到Safe Region的代码时,首先标识已经进入了Safe Region,如果这段时间内发生GC,JVM会忽略标识为Safe Region状态的用户线程即用户线程STW,等待JVM执行GC完毕;
  • 2、当用户线程即将离开Safe Region时, 会检查JVM是否已经完成GC,如果完成了,则用户线程继续运行,否则用户线程必须等待直到收到可以安全离开SafeRegion的信号为止;

最新文章

  1. UML类图(上):类、继承和实现
  2. 多线程异步导出excel
  3. C++多态(二)——函数重载(overloading)和操作符重载
  4. Lamp源码搭建
  5. c#的学习
  6. 描述Linux运行级别0-6的各自含义
  7. back(返回)键总结
  8. Please ensure that adb is correctly located at '...adb.exe' and can be executed.
  9. 【JavaEE基础】在Java中如何使用jdbc连接Sql2008数据库
  10. ArcGIS制图表达Representation实战篇3-控制点
  11. 学习Ajax
  12. Java中的集合概述
  13. VS2015编译GEOS的debug和release版本
  14. springboot引用dubbo的方式
  15. [Swift]LeetCode5. 最长回文子串 | Longest Palindromic Substring
  16. TCP三次握手及TCP连接状态 TCP报文首部格式
  17. jmeter java requst请求
  18. useradd和groupadd(Linux创建用户\用户组\设置\分配用户权限\多用户远程登录权限)的使用
  19. C++智能指针,指针容器原理及简单实现(auto_ptr,scoped_ptr,ptr_vector).
  20. elasticsearch系列四:搜索详解(搜索API、Query DSL)

热门文章

  1. 30分钟闲置服务器建站(gitlab为例)
  2. Redis设计与实现——多机数据库的实现
  3. async + await 异步
  4. Vue管理系统前端系列五自定义主题
  5. Linux高频操作
  6. RedHat 6.8 离线安装Docker (rpm包安装)
  7. WPF管理系统开发框架搭建指南,2020从入门到放弃
  8. 喵的Unity游戏开发之路 - 互动环境(有影响的运动)
  9. Mybatis入门篇之结果映射,你射准了吗?
  10. 万级K8s集群背后etcd稳定性及性能优化实践