• JVM(十九)—— 垃圾回收(五)


    Stop The World

    Stop The World简称STW,指的是GC事件发生过程中,会产生引用程序的停顿。停顿产生时整个应用程序都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW。

    可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿。

    • 分析工作必须在一个能确保一致性的快照中进行。
    • 一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上
    • 如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证。

    被STW终端的应用程序线程会在完成GC之后恢复,频繁中断会让用户感觉像是网速不快造成电影卡带一样,所以我们需要减少STW 的发生。

    • STW事件和采用哪款GC无关,所有的GC 都有这个事件。
    • 哪怕是G1也不能完全避免STW情况发生,只能说垃圾回收器越来越优秀,回收效率越来越高,尽可能缩短暂停时间。
    • STW是JVM在后台自动发起和自动完成的。在用户不可见的情况下,把用户正常的工作线程全部停掉。
    • 开发中不要用System.gc(),会导致STW发生。

    垃圾回收的并发与并行

    在这里插入图片描述

    并行(Parallel):指多条垃圾回收线程并行工作,但此时用户线程仍处于等待状态。如ParNew,Parallel Scavenge,Parallel Old.
    串行(Serial): 相较于并行的概念,单线程执行。如果内存不够,则程序暂停,启动JVM垃圾回收器进行垃圾回收。回收万,在启动程序的线程。

    在这里插入图片描述

    并发(Concurrent):指用户线程与垃圾回收线程同时执行,但不一定是并行的,可能会交替执行。垃圾回收线程在执行时不会停顿用户程序的运行。
    用户程序在继续运行,而垃圾收集程序线程运行于另一个CPU上,如CMS,G1.

    安全点和安全区域

    安全点

    程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为安全点。

    安全点的选择很重要,如果太少,用户线程长时间执行,可能导致GC 等待时间太长,如果太频繁,可能导致运行时的性能问题。大部分指令的知性时间都非常短暂,通常会根据是否具有让程序长时间执行的特征为标准。如选择一些执行时间较长的指令作为安全点,如方法调用,循环跳转和异常跳转等。

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

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

    安全区域

    安全点机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的安全点。但是程序不执行的时候呢?例如线程处于Sleep状态或Blocked状态,这时候线程无法相应JVM的中断请求,走到安全点去中断挂起,JVM也不太可能等待线程被唤醒。对于这种情况,就需要安全区域来解决。

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

    当线程运行到安全区域的代码时,首先标识已经进入了安全区域,如果这段时间发生GC,JVM会忽略标识为安全区域状态的线程。当线程即将离开安全区域时,会检查JVM是否已经完成GC,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开安全区域的信号为止。

  • 相关阅读:
    大数据之cdh集群安装
    6. Python 异常、模块与包
    【开源推荐】一个通用的后台管理系统
    营销互动类小游戏策划与开发
    Spring IOC之Condition 接口
    编程逻辑入门必备:演绎推理
    通过STM32F103C8T6配置完成基于SPI协议的0.96OLED屏显
    伊朗黑客对以色列科技和教育领域发起破坏性网络攻击
    小马识途:如何稀释百科词条里的负面信息?
    layer.load方法不加载,Ajax为同步时,layer.load方法不加载
  • 原文地址:https://blog.csdn.net/weixin_40920359/article/details/127820844