1、前文回顾

对象都分配在新生代的Eden区,然后每次垃圾回收之后,存活对象都进入Survivor区,下一次垃圾回收后的存活对象都进入另外一个Survivor区。

2、CMS垃圾回收的基本原理

采用标记清理算法,先通过追踪GC Roots的方法,看看各个对象是否被GC Roots追踪到了,如果可以话,那就是存活对象,否则就是垃圾对象,先

将垃圾对象都标记出来,然后一次性把垃圾对象都回收掉。

??问垃圾收集时,是标记存活还是标记垃圾?

DS推测:

1、YoungGC时,新生代存活对象少,采用复制算法把很少的存活复制到S区。代价小

2、OldGC时,老年代存活对象多,虽然GC Roots追踪到的都是存活,但此时处理垃圾对象的代价小,所以标记未追踪到的对象-前提是先知道(标记)哪些是存活,然后清除。

结论:YoungGG、OldGC都是要先标记存活对象。只是老年代需要额外标记垃圾对象,以便清除。

3、如果Stop the World然后垃圾回收会如何?

导致系统卡死时间过长,很多响应无法处理

所以:CMS采取垃圾回收线程和系统工作线程尽量同时执行的模式来处理

4、CMS如何实现系统一边工作的同时进行垃圾回收?

  1. 初始标记 -  STW ,标记出来所有GC Roots直接引用的对象。很快。注意:方法的局部变量和类的静态变量是GC Roots。但是实例变量不是GC Roots

  2. 并发标记 - 此阶段与应用程序并行执行,垃圾回收线程对已有的对象进行GC Roots追踪,即对GC Roots直接关联的全部老年代对象进行追踪,而不是遍历所有老年代对象,这里的理解和文中表述不一致,需要进一步确认(作者回复:是从GCRoots开始追踪)

  3. 重新标记 - STW,重新标记下在第二阶段里新创建的一些对象,还有一些已有对象可能失去引用变成垃圾的情况。其实就是对在第二阶段中被系统程序运行变动过的少数对象进行标记,所以运行速度很快。

  4. 并发清理 - 清理掉之前标记为垃圾的对象即可,跟系统程序并发运行,不影响系统程序的执行

任务

STW

备注

速度

初始标记

STW

标记出来所有GC Roots直接引用的对象

速度很快

并发标记

--

垃圾回收线程对已有的对象进行GC Roots追踪

重新标记

STW

变动过的少数对象进行标记

速度很快

并发清理

--

清理掉之前标记为垃圾的对象

注意:方法的局部变量和类的静态变量是GC Roots。但是类的实例变量不是GC Roots

问:fullgc了,程序还并行运行,创建出来的对象放那?会一直触发fullgc吗?如果对象太多堆放不下,会等着fullgc完成吗?这个时候也是世界停止吗?

fullgc同时一般会伴随着一次Young GC,如果第一次fullGC过程中,因为新创建的对象原因又达到了触发fullGC的条件,首先还是会先Young GC,然后尝试放入新生代,但此时老年代还没有回收完成,再触发一次MajorGC没什么意义,因为重新标记会干了这个事情。

如果Young GC后,新创建的对象仍然放不进内存,需要等待MajorGC结束,如果MajorGC结束后仍然放不进去,就会OOM了。

本文是《从 0 开始带你成为JVM实战高手》内容总结,版权问题,特此声明。详细内容:

如果购买,成功后加QQ群找群主返现10元

023、JVM实战总结:一步一图:那JVM老年代垃圾回收器CMS工作时,内部又干了些啥?相关推荐

  1. jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点

    文章目录 Pre 并发回收垃圾导致CPU资源紧张 Concurrent Mode Failure问题 内存碎片问题 什么情况下触发老年代GC Pre 上篇文章用一步一图的方式给大家讲清楚了CMS垃圾回 ...

  2. jvm性能调优 - 14JVM的老年代垃圾回收器CMS原理

    文章目录 Pre CMS垃圾回收的基本原理 如果Stop the World然后垃圾回收会如何? CMS如何实现系统一边工作的同时进行垃圾回收? 初始标记 并发标记 重新标记 并发清理 对CMS的垃圾 ...

  3. 029、JVM实战总结:大厂面试题:最新的G1垃圾回收器的工作原理,你能聊聊吗

    1.ParNew + CMS的组合让我们有哪些痛点? 痛点:STW,且停顿时间不可控 G1垃圾回收器比~更好的垃圾回收性能 2.G1垃圾回收器 G1 同时回收新生代和老年代的对象,把java堆拆分为多 ...

  4. JVM垃圾回收器cms详解

    关于serial,parnew,parallel等回收器的介绍可以参考上一篇jvm垃圾回收算法以及垃圾回收器,如何选择_bjzw的博客-CSDN博客 下面具体介绍一下cms,jdk8之后就已经废弃了c ...

  5. JVM参数调优-设置堆、新生代、老年代、持久代大小

    一.根据程序的运行状况查看其活跃的数据量 ①.活跃的数据: 1.应用程序运行于稳定状态时,老年代占用的java堆大小 2.应用程序运行于稳定状态时,永久代占用的java堆大小 其实就是FullGc后这 ...

  6. JVM垃圾回收器-CMS并发标记清除

    Java8的CMS垃圾回收器官方文档参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#con ...

  7. 深入理解JVM—满足什么条件的对象才会进入老年代?

    我们可能知道jvm调优,但是jvm调优到底是为了调整什么呢?或者说是优化什么?可能并不是特别清楚. 其实很简单,就是为了减少STW(stop the world),什么会造成这一现象呢,学过gc的应该 ...

  8. Tenured 区并发垃圾回收器CMS实战

    当使用CMS收集器时,当开始进行收集时,old代的收集过程如下所示: 1.首先jvm根据-XX:CMSInitiatingOccupancyFraction,-XX:+UseCMSInitiating ...

  9. 016、JVM实战总结:大厂面试题:JVM中有哪些垃圾回收算法,每个算法各自的优劣?

    1.前文回顾 略... 2.复制算法的背景引入 略... 3.一种不太好的垃圾回收思路 标记清除算法 - 碎片多 4.一个合理的垃圾回收思路 : 假设新生代内存,一半用来放新对象,一半用来存放从另一半 ...

最新文章

  1. 14 个经典的 Linux 终端命令行,这些工具堪称神器!
  2. python 模板匹配
  3. PHP和Javascript实现转换文件大小为人性化可读方式
  4. 自动打包linux,使用Jenkins如何自动打包部署linux
  5. JAVA_OA(十四)番外:JAVAWEB防止表单重复提交的方法整合(包括集群部署)
  6. linux C 进程内部存储管理
  7. spark1.3.1使用基础教程
  8. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
  9. Matlab求重复数字的个数tabulate
  10. 熊猫数据集_大熊猫数据框的5个基本操作
  11. 巧用异或运算符(洛谷P1161题题解,Java语言描述)
  12. Git笔记(23) 不同角色的贡献
  13. 非常优秀的swiper插件————幻灯片播放、图片轮播
  14. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  15. shedlock 重启系统报错问题_闲谈ShedLock解决分布式定时任务重复执行问题
  16. window下git的用户切换_Windows下Git的使用
  17. 关于 LiDAR 点云数据处理的一些思考
  18. 数学建模中的常见模型
  19. SVN忽略提交文件设置
  20. 老徐WEB:js入门学习 - 认识javascript

热门文章

  1. [Web Chart系列之五] 3. 实战draw2d 之图形填充色(纯色 or 渐变)
  2. cmd输入pip报错_安装虚拟环境+pip安装XXX包的常见操作与报错解决
  3. php 获取所有子目录名,php读取目录及子目录下所有文件名的方法,_PHP教程
  4. c mysql 并发处理_mysql队列中实现并发读的实现方法解析
  5. mysql -b -e_为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树(精干总结)
  6. Tomcat8.5.40启动后一直卡在日志At least one JAR was scanned for TLDs yet contained no TLDs
  7. PHP判断手机横向,H5横竖屏检测的方法
  8. node python 后台启动_NodeJS后台
  9. 【电脑帮助】解决Wind10系统桌面没有“我的电脑”图标的问题
  10. kettle设置变量中变量范围的设置说明