JVM:GC-垃圾收集器

Serial收集器

作用:单线程、新生代收集器
算法:使用复制算法
说明:
单线程的含义有两层:
只有一个垃圾回收线程参与GC,
在GC的过程中需要暂停其他工作线程。

缺陷:
1、在多CPU下,单线程收集的效率不高
2、在GC时必须暂停其他工作线程,对很多应用来说难以接受。

优点:
单CPU下,显得简单高效。

应用场景:
桌面级客户端应用,分配给虚拟机管理的内存不会很大。
收集几十到一两百的新生代对象,停顿也是毫秒级的,这点停顿还是可以接受的。

Serial Old收集器

作用:单线程、老年代收集器,Serial的老年代版本
算法:标记-整理
作用:
1、client下回收器
2、server下:
jdk1.5下与Parallel Scavenge搭配使用,
作为CMS的后备收集器

ParNew收集器

作用:多线程,新生代收集器。Serial的多线程版本
算法:同Serial 复制算法
应用场景:在CMS作为老年代收集器时,能配合使用的新生代收集器只有ParNew和Serial
注意:ParNew在单CPU环境下,通过超线程技术实现垃圾回收的效率远比不上Serial收集器,因为本身还存在线程交互的开销。但是随着CPU数量的提升,它对系统资源的有效利用还是有好处的。

Parallel Scavenge 收集器

作用:新生代、多线程并行收集
算法:复制。。

看起来跟ParNew一样,有什么区别吗?
ParNew及其他收集器着重的目标是缩短GC是用户线程的停顿时间。
而Parallel Scavenge 侧重 吞吐量
吞吐量=(执行用户线程时间)/(执行用户线程时间)+GC时间。因此被称为吞吐量优先收集器。

注意:
停顿时间越短,越适合需要用户交互的程序,迅速的响应可以提升用户体验。
而吞吐量优先的收集器适用于后台运算,而不需要与用户交互的线程,可以最大效率的使用CPU时间,快速完成任务。

老年代可以使用Serial Old/Parallel Old(优先)搭配。

Parallel Old 收集器

作用:Parallel Scavenge老年代版本,多线程,并行
算法:标记-整理

在注意吞吐量和CPU资源敏感的场景下,使用Parallel Scavenge+Parallel Old

CMS收集器

作用:老年代、与用户线程并发
算法:标记-清除

四个步骤:
1、初始标记:
只标记与GC ROOT直接关联的对象。速度很快。存在短暂的STOP THE WORLD.
2、并发标记:
从 GC ROOT 开始搜素的过程,耗时长。与用户线程并发。
3、重新标记:
标记并发标记过程中产生的垃圾,耗时比初始标记长,比并发标记短。需要STOP THE WORLD
4、并发清除:
清除标记的对象。与用户线程并发

缺陷:
1、对CPU资源敏感:
在与用户线程并发操作的过程中,虽然不会导致用户线程停顿,但是因为占用了一部分CPU资源而导致应用程序变慢,吞吐量降低。
CMS默认启动的垃圾回收线程数为
(CPU数+3)/4 占用超过25%的CPU资源,并且随着CPU数量的上升而下降。
当CPU为2时,需要有一半的CPU资源参与回收,对用户线程影响很大。

为了解决这个问题,出现了增量式的CMS,实现原理是抢占式来模拟多任务机制。就是在并发标记阶段,时GC线程与用户线程交替运行,但是实际效果很一般。
2、存在浮动垃圾。因为并发清除的时候,用户线程还在执行,会源源不断产生新的垃圾,这些垃圾只能在下一次GC才能被清理。
因此CMS不能等到年老代占满了才开始GC,需要预留一部分空间给浮动垃圾。
JDK1.5的启动阈值68%。
而JDK1.6的启动阈值是92%,要是CMS运行期间内存不足,就会Concurrent Mode Failure。此时就会启动备选收集器,Serial Old.

3、存在大量的内存碎片。因为使用的是标记清除算法。

因此CMS还提供了:
-XX:+UserCMSCompactAtFullCollection,用于要在顶不住执行FullGC时来一次内存碎片整理,此时无法并发,因此停顿时间不得不变长。
-XX:CMSFullGCBeforeCompaction:用于设置多少次不压缩的FullGC之后,跟着来一次压缩的。默认0,代表每次都要压缩。

G1收集器

关于Region:
G1把堆内存划分为多个大小相等的Region区域,

注意:
虽然保留了新生代老年代的概念,但是不再是物理隔离,而是一系列Region的集合。

关于Remebered Set:
G1为每个Region维护一个 Remebered Set,因此在标记阶段,不需要进行全堆扫描。

回收方式,可预测停顿时间:
G1跟踪每一个Region垃圾堆积的价值大小(回收所获得的空间与回收时间之比),在后台维护一个优先列表。
每次GC时,在允许的收集时间内,回收最有价值的Region,以求在有限的时间内,尽可能的达到回收的最高效率。

G1的几个步骤:
1、初始标记:
同CMS
2、并发标记:
同CMS
3、最终标记:
将并发标记阶段,用户线程运行导致引用关系变化而记录的Remembered Set Logs合并到Remembered Set上。
这个阶段需要STW.
4、筛选回收:
回收最有回收价值的Region

特点:
1、并发并行。
2、分代回收:保留了分代回收的概念。但是不需要其他回收集器配合。能够用不同的方式处理新对象和熬过多次GC的老对象。
3、空间整合:整体看是标记-整理,局部【两个Region】看是复制算法,两者都不产生内存碎片,在GC后都能得到规整的内存空间。
4、可预测的停顿:以Region划分空间,根据回收价值排序优先回收价值高的Region,以求在有限时间内达到更高的回收效率。

垃圾收集器参数记录

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_28605513/article/details/85163584