Serial 和 ParNew 在进行垃圾回收时,为什么需要stop the world?不stop thw world 可以吗?

在进行标记的时候,如果工作线程不停止的话,那么肯定会有新对象生成。这些对象是没有被标记的,里面可能有存活的对象,也可能有已经没有被引用的垃圾对象。那么在标记完后,进行回收时。要如何回收?

因为Serial 和 ParNew 是采用的复制算法。回收的时候,是需要把存活对象移到Survivor中的。而那些没有被标记的,有存活的,也有垃圾对象。显然不能全部移动到survivor 中的。

所以,在进行新生代回收的时候,是需要stop the world 的。

CMS 进行垃圾回收的时,为什么有些阶段,工作线程可以不停止?

在CMS 回收器中,回收是分为四个阶段的。初始标记、并发标记、重新标记、并发清理。其中,并发标记和并发清理是可以不停止工作线程的。

这里之可以不停止工作线程。也是和CMS 采用的回收算法有关的。

1、并发标记阶段

这个是比较耗时的,工作线程可以不停止。那么就有可能会有新对象进入老年代。这些新进入的对象。在重新标记阶段。是会被标记的。所以,这个阶段可以不停止工作线程。不过这个阶段对系统负载也是很高的(回收线程和工作线程同时存在)。

2、并发清理阶段

这个也是比较耗时的,工作线程也可以不停止。这里也有可能有新对象进入老年代的。这时候这些都是没有被标记的。其实,这里没有被标记的,就相当于不会被回收了。而CMS 采用的是标记-清理算法。这些没有被回收的是不影响的,大不了下一次在进行回收。不像ParNew 采用的是复制算法。需要把存活的移动到survivor 中(ParNew 其实也可以把没有标记的移动到survivor中,不过代价很大,因为大概率survivor 放不下会导致进入老年代)。所以,并发清理阶段,也是可以不停止工作线程的。

另外,在老年代回收时,有存活对象进入老年代的概率其实也是比较小的。大部分也会在新生代被回收掉。或者进入survivor区中。

这里回收垃圾时,是否stop the world。其实跟采用的回收算法是相关的。

CMS 不停止工作线程,会有哪些问题?

如果不停止工作线程,那么是有可能有存活对象进入老年代的。这时候就要有预留的空间给这些存活对象。所以,老年代回收时,不是等老年代满了才回收的。比如我们预留了10%空间,那么老年代使用率达到90%的时候,就会进行垃圾回收(老年代垃圾回收的情况不止这种,比如还有老年代空间担保机制,也可能会触发垃圾回收的)。

另外,如果在垃圾回收的时候,有新存活对象进入老年代,并且总大小超过了10%时,这时候放不下了!要怎么办?这个时候,是会触发 Concurrent Mode Failure 的。就是回收失败。之后,就会退化为 Serial old 垃圾回收器进行回收。会停止工作线程。重新标记,再回收。

所以,在CMS 中,为了不停止工作线程。是有可能引入其他问题。比如上面 Concurrent Mode Failure。这时候效率就很低了。需要花费很长时间进行old gc。

对于发生了 Concurrent Mode Failure 的时候,就要进行分析。是程序业务逻辑的问题,还是预留的空间大小太小等等。

java为啥要stw_【JVM 学习】ParNew 为什么要STW相关推荐

  1. java之JVM学习全过程学习记录

    java之JVM学习记录其中有许多借鉴综合,感谢通哥也感谢大佬们,一起学习加油) 1.JAVA的三种常量池字符串常量池,运行时常量池,class文件常量池 2.类加载器加载类文件和执行引擎学习过程 3 ...

  2. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  3. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  4. JVM学习教程,带你轻松掌握Java虚拟机,吊打面试官

    前言: Java 虚拟机日益成为互联网大厂面试的重要内容,对于 Java 开发者而言,只有在了解 Java 背后的原理后,才能写出更高质量的代码,才能在错综复杂的 bug 中快速定位出问题并找到解决方 ...

  5. Java的wait()、notify()学习三部曲之一:JVM源码分析

    原文链接:https://blog.csdn.net/boling_cavalry/article/details/77793224 综述 Java的wait().notify()学习三部曲由三篇文章 ...

  6. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  7. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  8. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  9. java stw_快速理解Java垃圾回收和jvm中的stw

    Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外).Java中一种全局暂停现象,全局停顿,所有Java代码停 ...

最新文章

  1. 综述|基于深度学习方式的场景分类算法
  2. 自定义PointViewPager依赖库
  3. Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
  4. mod php是什么意思,mod函数是什么意思
  5. element input 只能输入数字_Python之input()函数
  6. 语音识别传统方法(GMM+HMM+NGRAM)概述
  7. 德鲁伊 oltp oltp_内存中OLTP系列–简介
  8. lodop简单入门教程
  9. Camera Shutter Sound can't restore to default
  10. php 一键wifi,Mac wifi 自动控制脚本
  11. latex希腊字母表
  12. Order by 语句 的使用
  13. JetChat-简仿微信聊天应用
  14. Combating Spyware in the Enterprise
  15. 实现 | 朴素贝叶斯模型算法研究与实例分析
  16. 计算机控制系统的输入输出信号,工业控制系统的输入与输出信号
  17. 计算机系统应用是不是核心期刊,计算机系统应用
  18. 动态规划之硬币面值组合问题
  19. JSP设置Excel表格换行_Excel中快速将阿拉伯数字转化为大写文字的妙招
  20. python多目标跟踪卡尔曼滤波_卡尔曼滤波+单目标追踪+python-opencv

热门文章

  1. 无代码开发平台通讯录导出入门教程
  2. gojs v2.3.5去水印
  3. ESP32 + Python守护家庭健康、自己动手做个甲醛浓度检测设备
  4. 岑溪洁净实验室设计布局规划总结
  5. Python:openpyxl实现在excel绘制扇形图
  6. 《英雄联盟》职业联赛第七周最后的抢分之战
  7. 地图战“疫”背后,是BAT的“圈层生态”之争
  8. WebSocket简单调用
  9. 【android开发】手势滑动关闭Activity(随手指消失)的辅助类的实现
  10. 新浪微博优秀工具和应用非深度主流试用体验分析推荐