【JVM】四、垃圾收集器的介绍

如果说上面我们讲的收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。

以下讲的收集器基于JDK1.7的G1收集器之后的HotSpot虚拟机,这个JVM包含的所有收集器如下图所示:

两个收集器之间的连线,表示它们可以搭配使用。收集器所处的区域表示它是属于新生代收集器还是老年代收集器。其中ZGC为Java11引入的新的垃圾收集器。

Java各版本默认的收集器 :

在讲具体的收集器之前我们先来明确三个概念 ——

1、并行(Parallel) :指多条垃圾收集线程并行工作,用户线程仍处于等待状态

2、并发(Concurrent) ::指用户线程与垃圾收集线程同时执行(不一定并行,可能会交替执行),用户程序继续运行,而垃圾收集程序在另外一个CPU上。

3、吞吐量:就是CPU用于运行用户代码的时间与CPU总消耗时间的比值。

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

例如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%


4.1 Serial收集器 (新生代收集器,串行GC)

  • 特性

Serial收集器是最基本、发展历史最悠久的收集器,是一个单线程的收集器。在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。就是所谓的“Stop The World。”

  • 应用场景

Serial收集器是虚拟机运行在Client模式下的默认新生代收集器。

  • 优势

简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。 实际上到现在为止 : 它依然是虚拟机运行在Client模式下的默认新生代收集器

 

4.2 ParNew收集器 (新生代收集器,并行GC)

ParNew收集器其实就是Serial收集器的多线程版本,采用 “复制算法”

除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一样。在实现上,这两种收集器也共用了相当多的代码。

ParNew收集器Serial收集器的对比 ——

ParNew收集器在单CPU的环境中绝对不会有比Serial收集器更好的效果,甚至由于存在线程交互的开销,该收集器在通过超线程技术实现的两个CPU的环境中都不能百分之百地保证可以超越Serial收集器。然而,随着可以使用的CPU的数量的增加,它对于GC时系统资源的有效利用还是很有好处的。

4.3 Parallel Scavenge收集器 (新生代收集器,并行GC)

Parallel Scavenge收集器是一个新生代收集器,主要采用复制算法,与ParNew类似,但关注点与其他搜集器不同,目标是达到一个可控的吞吐量。它又是一个并行的多线程收集器。

 

4.4 Serial Old收集器 (老年代收集器,串行GC)

Serial Old是Serial收集器的老年代版本,同样是一个单线程收集器,使用标记-整理算法。

 

4.5 Parallel Old收集器 (老年代收集器,并行GC)

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程“标记-整理”算法。在JDK 1.6中才开始提供。

 

4.6 CMS收集器(老年代收集器,并发GC)

CMS(Concurrent Mark and Sweep 并发-标记-清除),是一种以获取最短回收停顿时间为目标的收集器。基于并发、使用标记清除算法,只针对老年代进行垃圾回收。CMS收集器工作时,尽可能让GC线程和用户线程并发执行,以达到降低STW时间的目的。

整个操作步骤分为四步:初始标记(CMS initial mark)、并发标记(CMS concurrent mark)、重新标记(CMS remark)、并发清除(CMS concurrent sweep)。

1、初始标记(CMS initial mark) 初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要“Stop The World”。

2、并发标记(CMS concurrent mark) 并发标记阶段就是进行GC Roots Tracing的过程。

3、重新标记(CMS remark) 重新标记阶段是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短,仍然需要“Stop The World”。

4、并发清除(CMS concurrent sweep) 并发清除阶段会清除对象。

优点:并发收集、低停顿。

缺点:对CPU资源非常敏感、无法处理浮动垃圾、标记-清除算法导致的空间碎片。

 

4.7 G1收集器 (唯一一款全区域的垃圾回收器)

G1(Garbage-First)是一款面向服务端应用的垃圾收集器。支持新生代和老年代空间的垃圾收集。

使用G1收集器时,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔阂了,它们都是一部分(可以不连续)Region的集合,然后并行的对其进行垃圾回收。

G1垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。

G1会跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也就是Garbage-First名称的来由)。

G1收集器的运作大致可划分为以下几个步骤:初始标记(Initial Marking)、并发标记(Concurrent Marking)、最终标记(Final Marking)、筛选回收(Live Data Counting and Evacuation)。

其中,筛选回收阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率。

 

注:以上资料整理来自网络,如有不详细之处,敬请见谅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值