分析&回答


一、Serial收集器(新生代、复制算法)

这是一个单线程工作的收集器,这个单线程并不是只用一条线程完成垃圾回收的操作,而是在进行垃圾回收的时候,必须停掉其他所有的工作线程,直到它收集结束。

二、ParNew收集器(新生代、复制算法)

ParNew收集器实质上是Serial收集器的多线程并行版本,可以同时采用多条线程进行垃圾处理。

三、Parallel Scavenge收集器(新生代、复制算法)

Parallel Scavenge收集器是一款新生代收集器,基于标记复制算法,能够并行收集。特点是其关注点和其他收集器不一样,它的目标是达到一个可控的吞吐量,而不是向CMS等收集器一样尽可能的缩短垃圾收集的时候用户线程的停止时间。

四、Serial Old收集器(老年代、整理算法)

Serial Old收集器是Serial收集器的老年代版本,同样是一个单线程的收集器,使用标记-整理算法,有俩种用途:一是在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用;二是作为CMS收集器失败之后的后预案。

五、Parallel Old收集器(老年代、整理算法)

Parallel Old是Parallel Scavenge的老年代版本,支持并发收集,基于标记-整理算法实现。在注重吞吐量或者处理器资源较为稀缺的场合,优先选取Paralle Scavenge + Parallel Old的搭配方式。

六、CMS收集器(Concurrent Mark Sweep)

CMS收集器是一种以获取最短停顿时间为目标的垃圾收集器。从名字上就可以看出CMS收集器是基于标记-清除法的垃圾收集器,运作过程要相对来说复杂一些,整个过程分为四个阶段:

  1. 初始标记:标记GC Roots能直接关联到的对象,速度很快,需要暂停用户线程;
  2. 并发标记:是指从GC Roots的关联对象开始遍历整个对象图的过程,耗时比较长但是不要需要暂停用户线程;
  3. 重新标记:修正在并发标记期间,因用户线程继续运作导致标记产生变动的那一部分对象的标记记录,需要暂停用户线程,但是时间相对并发标记阶段还是很短的;
  4. 并发清除:清理掉标记阶段已经死亡的对象,由于使用清除算法,不需要移动对象,因此不需要暂停用户线程,并发清除;

总的来说,CMS收集器的内存回收是和用户线程是一起并发执行的。

CMS垃圾回收器主要有如下三个缺点

  1. CMS收集器对处理器资源非常敏感。CMS的默认回收线程数是(处理器核心数+3)/4,CPU的核心数越少,CMS回收对用户线程的影响就越大。
  2. CMS收集器无法回收浮动垃圾,有可能出现一次并发清除失败而导致暂停用户线程进行Full GC。在CMS的并发清理阶段,用户线程还是在运行的,程序在结束以后会有新的垃圾产生,但是这部分垃圾CMS无法在当此清除他们,只能在下一次再次清除,这部分垃圾就叫浮动垃圾。在进行垃圾清理的过程中,由于用户线程还在运行中,因此需要留下一块空间供用户线程使用。当CMS运行期间预留的内存无法满足用户线程新建对象的需要,就会出现并发清除失败,进而使用Serial Old收集器来暂停用户线程收集老年代的垃圾。
  3. CMS是基于标记清除算法的垃圾回收器,那么就会产生内存碎片,这样分配大对象就会遇到麻烦,不得不提前触发一次Full GC。

七、G1回收器(Garbage First)

G1回收器是一款主要面向服务端应用的垃圾回收器,JDK9之后,它替代了Parallel回收器。G1回收器可以面向堆内存中的任意地方来回收内存(Mix GC),没有被局限在新生代、老年代、和整堆回收中。

G1回收器中的基于Region的堆内存布局是实现上述目标的关键。G1将Java堆分为多个大小相等的独立区域(Region),每个Region都可以根据需要扮演新生代的Eden空间、Survivior空间以及老年代空间。Region中还有一个特殊的Humongos区域,用于存储大对象,当大对象的大小超过单个Region的时候,这个对象会被放在多个连续的Humongos Region中,G1会把这个区域当作老年代来处理。

G1收集器的新生代和老年代并不是固定的,他们都是一系列区域(不需要连续)的动态集合,G1进行垃圾回收的时候Region是垃圾回收的最小单元,每次收集的内存空间是G1的整数倍,有限回收收益最大的区域,能够让G1收集器在有限的时间内获取尽可能高的手机效率。

G1收集的过程大致分为以下四个步骤:

  1. 初始标记:标记GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段的用户线程并发工作的时候能正确的在可用Region中分配新对象,此阶段需要停止用户线程,但是时间短,而且是在Minor GC中同步完成的。
  2. 并发标记:从GC Roots开始对堆中的对象进行可达性分析,扫描整个堆,耗时较长,但是和用户进程是并发进行的;
  3. 最终标记:对用户线程做另一个短暂的暂停,用户处理并发阶段结束后遗留的少量的STAB记录;
  4. 筛选回收:对各个Region的回收价值和成本进行排序,根据用户期望的停顿时间来制定停顿计划,把回收的那部分Region中存活的对象复制到空的Region中,再清理掉旧的Region中的全部空间,涉及对象的复制移动,需要暂停用户线程


G1在整体上是基于标记整理算法实现的,但是从俩个Region来看,是基于标记复制算法,这俩种方法确保G1在垃圾回收的时候不会产生内存碎片。


为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码小程序刷起来!

为了一站式解决面者刷题问题,部分内容可能存在摘录情况,如有侵权辛苦您留言联系我们,我们会删除文章或添加引用文案,Thanks!

JVM垃圾回收器有哪些相关推荐

  1. Jvm垃圾回收器(终结篇)

    知识回顾: 第一篇<Jvm垃圾回收器(基础篇)>主要讲述了判断对象的生死?两种基础判断对象生死的算法.引用计数法.可达性分析算法,方法区的回收.在第二篇<Jvm垃圾回收器(算法篇)& ...

  2. JVM 垃圾回收器工作原理及使用实例介绍

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自 ...

  3. JVM 垃圾回收器 ZGC

    JVM 垃圾回收器 ZGC简介 学习ZGC,主要通过学习ZGC设计与实现书籍,并以博客的形式记录学习内容 ZGC在JDK11引入,目前被标记为实验性质.ZGC的出现是为了解决G1的不足. G1不足之处 ...

  4. JVM垃圾回收器工作原理及使用实例介绍

    垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥 ...

  5. JVM垃圾回收器(Hotspot)

    JVM垃圾回收器发展与对比 一,GC回收算法: 1,引用计数法 对象中使用计数器.此算法无法解决互相引用的场景. 2,可达性分析算法 从gcRoots集合出发,查找引用链,如没有链路链接的对象,则初次 ...

  6. JVM 垃圾回收器工作原理及使用实例介绍(原文已发表于IBM开发者论坛)

    打个广告,本人的<大话Java性能优化>一书已经在亚马逊.当当.京东.天猫出售,感谢大家对致力于技术推广梦想者的支持. 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理, ...

  7. c++ 多线程 垃圾回收器_7种jvm垃圾回收器,这次全部搞懂

    前言 之前我们讲解了jvm的组成结构与垃圾回收算法等知识点,今天我们来讲讲jvm最重要的堆内存是如何使用垃圾回收器进行垃圾回收,并且如何使用命令去配置使用这些垃圾回收器. 堆内存详解 上面这个图大家应 ...

  8. c++ 多线程 垃圾回收器_JavaSE基础代码(3)--JavaSE程序入口,JDK,JRE,JVM垃圾回收器的关系与作用...

    在前面的几章中我们一直在进行环境的搭建,然而并没有对代码进行讲解,那么从现在起,我们开始撕开Java程序神秘的外衣.来了解他.以便于完成我们想要实现的功能 JavaSE程序入口: 在生活中我们要做一个 ...

  9. JVM垃圾回收器G1详解

    1.概述 在我们应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化.G1(Garbage ...

  10. JVM垃圾回收器cms详解

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

最新文章

  1. pandas编写自定义函数高亮显示(highlight)dataframe中的指定内容(数值)(highlighting a specific values or content of a panda
  2. c语言求两者之间最小数,C语言课件第2章基本数据类型.ppt
  3. 通过xrdp实现远程桌面连接Windows Azure linux虚拟机
  4. [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)
  5. LeetCode MySQL 1211. 查询结果的质量和占比
  6. 实例解读什么是Redis缓存穿透、缓存雪崩和缓存击穿
  7. 好的营销,往往叫广深高速
  8. 文件系统在NVMe SSD上的性能表现分析
  9. Ubuntu14.04如何启用界面root账户登录
  10. 词频统计软件_单词词频统计小软件
  11. SAP中文件的上传和下载
  12. 运输问题中产销不平衡问题(表上作业法和LINGO方法)
  13. 计算机营销专业毕业生自我评价,市场营销专业毕业生自我评价
  14. 应用为重,智慧城市迈入发展新阶段 | 爱分析报告
  15. 十进制转换八进制代码c语言,利用栈将十进制转换为八进制(C语言)
  16. 黑盒测试和白盒测试的基本原理/区别是什么?
  17. 关于BeanUtils.populate
  18. 斐波那契(兔子)数列python
  19. 我的世界服务器修改spawn,编辑“命令/spawnpoint” - Minecraft Wiki,最详细的官方我的世界百科...
  20. 提速20倍!谷歌AI发布TensorFlow 3D,智能汽车场景亲测好用

热门文章

  1. aix 安装oracle 12c,AIX安装oracle12C
  2. GBDT与XGB的异同
  3. 灵飞经3 印神无双 第十四章 印神古墓 1
  4. 聊一聊数据库中的锁分类(乐观锁、悲观锁、共享锁、排它锁、表级锁、行级锁、页面锁)...
  5. 谷歌浏览器打开普通用户_Win7谷歌浏览器怎么设置多用户登录?-Win7谷歌浏览器设置多用户登录的方法 - 河东软件园...
  6. shell怎么把负数变成正数_【硬核】年化收益率(复利)怎么算
  7. PostgreSQL启动关闭服务
  8. Zabbix监控原理
  9. 用计算机计算泄压面积,牢记|遇到泄压面积的计算题,你会解吗?
  10. Git客户端Sourcetree工具安装使用详解命令