🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了STW的地点【即为程序中适合GC的地点】——安全点与安全区域🌈⭕🔥
🔥 《剑指JVM》序言-CSDN博客
🔥 《剑指JVM》全书-CSDN博客
🌈章节引出:
前一篇章:《剑指JVM》——第15章——Stop-The-world——垃圾收集相关概念2-CSDN博客
在第15.3节讲到,在垃圾回收过程中,应用程序会产生停顿,发生STW现象。但是应用程序在执行过程中,并不是在任意位置都适合停顿下来进行GC的,只有在特定的位置才能停顿下来**进行 GC 操作,这些特定的位置被称为安全点(Safe Point)。**
15.4 安全点与安全区域
15.4.1 安全点
安全点的选择至关重要,如果安全点太少可能导致GC等待的时间太长,如果安全点太密可能导致运行时的性能问题。
那么,哪些位置作为安全点合适呢?通常选择一些运行时间较长的指令位置,例如方法调用、循环跳转等。
当 GC 发生时,如何保证应用程序的线程是在安全点呢?
**抢先式中断: **GC抢先中断所有线程。如果发现某个线程不在安全点,就重新恢复该线程让线程跑到安全点。(这种方式是由GC线程占主导位置的,违背了应用程序才是主角的定位所以目前几乎所有虚拟机都不选择这种方式。
**主动式中断: **GC线程给自己设置一个中断标志,各个应用线程运行到安全点的时候主动轮询这个标志,如果此时 GC线程的中断标志为真,则将自己中断挂起。这种方式的好处是由应用程序在安全点主动发起中断,而不会出现被迫在非安全点的位置先中断的情况。
15.4.2安全区域
安全点机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的安全点。但是,应用程序的线程“不执行”怎么办呢? 例如线程处于阻塞(Blocked)状态,这时候应用线程无法响应 JVM 的中断请求,“走”到安全点去中断挂起,JVM也不太可能等待应用线程被唤醒之后再进行GC。对于这种情况,就需要安全区域(SafeRegion)机制来解决_
安全区域是指在一段代码片段中,**对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。**
我们也可以把安全区域看作是被“放大”了的安全点。在程序实际运行过程中,线程对于安全区域的处理方式如下。
(1)当线程运行安全区域的代码时,首先标识已经进入了安全区域,如果这段时间内发生GC,JVM 会**忽略标识为安全区域状态的线程。【便于进行GC】**
(2)当线程即将离开安全区域时,**会检查JVM是否已经完成GC**,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开安全区域的信号为止
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列**** 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理**** 关注走一波💕💕
🌈🌈微服务项目之黑马头条**** ** 关注走一波**💕💕
🌈🌈redis深度项目之黑马点评** **关注走一波💕💕
🌈🌈JAVA面试八股文系列专栏** 关注走一波**💕💕
🌈🌈JAVA基础试题集精讲 ** 关注走一波💕💕 **
🌈🌈**********代码随想录精讲200题 ************** 关注走一波💕💕
总栏
**🌈🌈JAVA基础要夯牢 ** 关注走一波💕💕
🌈🌈JAVA后端技术栈** 关注走一波**💕💕
🌈🌈JAVA面试八股文** 关注走一波**💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套**** 关注走一波💕💕
🌈🌈数据结构与算法 ******** 关注走一波💕💕
🌈🌈**************************必知必会工具集 ****************************** 关注走一波💕💕
🌈🌈书籍网课笔记汇总**** 关注走一波💕💕 ** **
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!
版权归原作者 Ethan Yankang 所有, 如有侵权,请联系我们删除。