概述:
ParNew收集器实质上是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio
、-XX: PretenureSizeThreshold
、-XX:HandlePromotionFailure
等)、收集算法、Stop The World
、对象分配规则、回收策略等都与Serial收集器完全一致,在实现上这两种收集器也共用了相当多的代码。
ParNew收集器的工作过程如图:
限制:
除了Serial
收集器外,目前只有能ParNew
能与CMS
收集器配合工作。
应用场景:
ParNew收集器除了支持多线程并行收集之外,其他与Serial收集器相比并没有太多创新之处,但它却是不少运行在服务端模式下的HotSpot虚拟机。
注意,从ParNew收集器开始,后面还将会接触到若干款涉及“并发”和“并行”概念的收集器。这里解释下:
- 并行(Parallel):并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态。
- 并发(Concurrent):并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定影响。
概述:
Parallel Scavenge收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器
特点:
CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即:
举个例子就是,如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%
停顿时间短和高吞吐量各自优点:
- 停顿时间越短就越适合需要与用户交互或需要保证服务响应质量的程序,良好的响应速度能提升用户体验
- 高吞吐量则可以最高效率地利用处理器资源,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的分析任务
设置吞吐量参数:
Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是① 控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis
参数以及直接② 设置吞吐量大小的-XX:GCTimeRatio
参数。
自适应的调节策略:
由于与吞吐量关系密切,Parallel Scavenge收集器也经常被称作吞吐量优先收集器。除上述两个参数之外,Parallel Scavenge收集器还有一个参数-XX:+UseAdaptiveSizePolicy
值得我们关注。这是一 个开关参数,当这个参数被激活之后,就不需要人工指定新生代的大小、Eden与Survivor区的比例、晋升老年代对象大小等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。这种调节方式称为垃圾收集的自适应的调节策略(GC Ergonomics)
概述:
Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。
应用场景:
-
这个收集器的主要意义也是供客户端模式下的HotSpot虚拟机使用
-
如果在服务端模式下,它也可能有两种用途:
-
一种是在JDK 5以及之前的版本中与
Parallel Scavenge
收集器搭配使用 -
另外一种就是作为
CMS
收集器发生失败时的后备预案,在并发收集发生Concurrent Mode Failure
时使用
Serial Old收集器的工作过程如图:
注意:
Parallel Scavenge收集器架构中本身有PS MarkSweep收集器来进行老年代收集,并非直接调用Serial Old收集器,但是这个PS MarkSweep收集器与Serial Old的实现几乎是一样的,所以在官方的许多资料中都是直接以Serial Old代替PS MarkSweep进行讲解
概述:
Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。
应用场景:
在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge + Parallel Old
收集器这个组合
Parallel Old收集器的工作过程如图:
概述:
CMS
(Concurrent Mark Sweep
)收集器是一种以获取最短回收停顿时间为目标的收集器。
应用场景:
目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求。
CMS收集器是基于标记-清除算法实现的,它的运作过程分为四个步骤:
-
初始标记(CMS initial mark):仅仅只是标记一下
GC Roots
能直接关联到的对象,速度很快。需要Stop The World
。 -
并发标记(CMS concurrent mark):就是从
GC Roots
的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。 -
重新标记(CMS remark):是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要
Stop The World
。这个阶段的停顿时间通常会比初始标记阶段稍长一 些,但也远比并发标记阶段的时间短。 -
并发清除(CMS concurrent sweep):清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS 收集器运作图:
优点:
并发收集、低停顿
缺点:
-
CMS收集器对处理器资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但却会因为占用了一部分线程(或者说处理器的计算能力)而导致应用程序变慢,降低总吞吐量。
-
由于CMS收集器无法处理浮动垃圾,有可能出现并发失败
Con-current Mode Failure
失败进而导致另一次完全Stop The World
的Full GC
的产生。 -
CMS是一款基于标记-清除算法实现的收集器,收集结束时会有大量空间碎片产生。空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很多剩余空间,但就是无法找到足够大的连续空间来分配当前对象,而不得不提前触发一次
Full GC
的情况。
降低吞吐量的具体原因?
CMS默认启动的回收线程数是(处理器核心数量 +3)/4,也就是说,如果处理器核心数在四个或以上,并发回收时垃圾收集线程只占用不超过25%的。处理器运算资源,并且会随着处理器核心数量的增加而下降。
但是当处理器核心数量不足四个时, CMS对用户程序的影响就可能变得很大。如果应用本来的处理器负载就很高,还要分出一半的运算能力去执行收集器线程,就可能导致用户程序的执行速度忽然大幅降低。
什么是浮动垃圾?
在CMS的并发标记和并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集时再清理掉。这一部分垃圾就称为浮动垃圾。
概述:
Garbage First
(简称G1
)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region
的内存布局形式。G1收集器被Oracle官方称为“全功能的垃圾收集器”(Fully-Featured Garbage Collector)。
应用场景:
G1是一款主要面向服务端应用的垃圾收集器。JDK 9
发布之日,G1
宣告取代Parallel Scavenge+Parallel Old
组合,成为服务端模式下的默认垃圾收集器。
G1的改变:
G1可以面向堆内存任何部分来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC
模式。
G1堆内存的布局与其他收集器的差异:
G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域Region,每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region
采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。
Humongous区域:
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
读者福利
由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴
更多笔记分享
目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-zQpDA3w1-1711014941846)]
读者福利
由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴
[外链图片转存中…(img-rdfyuAQA-1711014941846)]
[外链图片转存中…(img-YNNHCCZz-1711014941847)]
[外链图片转存中…(img-zSAjRV06-1711014941847)]
更多笔记分享
[外链图片转存中…(img-xwXuyt4n-1711014941848)]