垃圾收集器分类
按照垃圾收集阶段的垃圾收集线程数来分类
串行垃圾回收器:垃圾回收阶段只可以一个垃圾回收线程执行操作
并行垃圾回收器:垃圾回收阶段可以多垃圾回收线程并行操作
按照垃圾线程和用户线程有没有并行执行能力来分类(并行执行能力代表垃圾收集线程与用户线程并行执行的过程中不影响垃圾收集过程的安全性)
并发垃圾回收器:并发垃圾回收器在操作执行完之前,用户线程可以并行的执行,不叫并行垃圾回收器是为了区别于另一种分类下的并行垃圾回收器(垃圾收集线程是否可以并行为分类标准)
独占式垃圾回收器:独占式垃圾回收器在执行完操作之前,用户线程不可以同时开始执行过程
按照垃圾收集过程会不会整理内存空间分类
压缩式垃圾回收器:会整理内存空间
非压缩式垃圾回收器:不会整理内存空间
按照作用目标分类
年轻代垃圾回收器
老年代垃圾回收器
垃圾收集器分类案列
串行垃圾收集器(垃圾收集线程之间不可以并行执行):serial,serial old
并行垃圾收集器(垃圾收集线程之间可以并行执行):ParNew,Parallel Scavenge,Parallel Old
并发垃圾收集器(用户线程和垃圾收集线程可以并发并行执行,垃圾收集线程本身也可以并行执行):CMS,G1
垃圾收集器组合关系及其介绍(按照分别作用于新生代和老年代组合)
Serial,Serial Old
Serial
作用于新生代,工作期间只能单线程执行,使用复制算法,整个垃圾回收过程STW,串行垃圾回收器
Serial Old
作用于老年代,工作期间只能单线程执行,使用标记压缩算法,标记阶段和清理阶段整个垃圾回收过程STW,串行垃圾回收器
组合开启参数
-XX:+UseSerialGC
适合场景
硬件系统只有一个单核处理器,最大程度释放执行引擎吞吐能力
ParNew,CMS,Serial Old
ParNew
作用于新生代,工作期间可以多线程并行执行,使用复制算法,整个垃圾回收过程STW,并行垃圾回收器
指定使用当前垃圾收集器
-XX:+UseParNewGC
配套指定并行垃圾收集线程数
-XX:ParallelGCThreads
CMS
作用于老年代,使用标记清除算法
配置参数
指定使用当前垃圾收集器
-XX:+UseConcMarkSweepGC
配套指定老年代触发垃圾回收的阈值
-XX:CMSLnitiatingOccupanyFraction
CMS工作过程
![](https://img.haomeiwen.com/i29526965/67909648e501ef1d.png)
初始标记
STW,单线程执行,只标记与根直接关联的对象,过程很快
并发标记
可以与用户线程并行执行,标记线程只有一个线程,从初级标记阶段标记的对象出发遍历整个对象图,耗时长
浮动垃圾在这里产生,只能下一轮再处理
重新标记
STW,多线程并行执行,修正并发标记阶段导致的错标记
并发清除
可以与用户线程并行执行,清除线程只有一个线程,清理前面三个阶段最终标记为死亡的对象
浮动垃圾在这里产生,只能下一轮再处理
要点说明
并发标记和并发清除阶段,由于用户线程并行执行消耗内存,此期间再次触发内存不足时,会直接切换到SerialOld收集器开始执行垃圾收集过程,整个过程STW
Serial Old
作用于老年代,工作期间只能单线程执行,使用标记压缩算法,标记阶段和清理阶段整个垃圾回收过程STW,串行垃圾回收器
组合开启参数
-XX:+UseConcMarkSweepGC
适用场景
官方不建议使用,核心是低延时场景
Parallel,Parallel Old
Parallel
作用于新生代,工作期间可以多线程并行执行,使用复制算法,整个垃圾回收过程STW,并行垃圾回收器
目标吞吐能力
-XX:GCTimeRatio
取值范围(0,100)
最大GC暂停毫秒
-XX:MaxGCPauseMillis
开启自适应调价策略
-XX:+UseAdaptiveSizePolicy
配套指定并行垃圾收集线程数
-XX:ParallelGCThreads
Parallel Old
作用于老年代,工作期间可以多线程并行执行,使用标记压缩算法,整个垃圾回收过程STW,并行垃圾回收器
组合开启参数
-XX:UseParallelGC
G1
实现原理理解
以分区为单位进行内存管理,每个分区逻辑上又有一个分代角色,相同分代角色的分区不要求物理内存上连续,回收分区的时候是将一个分区内的数据复制到另一个分区里,有数据的分区在物理内存上集中存储,需要进行分区回收时优先回收最具性价比的分区(老年代角色分区回收策略,新生代角色回收策略是全部回收),垃圾收集器维护了一个分区回收性价比列表,将每个有数据的分区按照回收性价比进行排序,回收性价比的计算规则为:分区回收能处理的垃圾对象总大小/回收经验统计的分区回收平均耗时
概念介绍
可预测的停顿时间模型
根据分区回收性价比列表,分区回收历史平均耗时统计,实现指定分区回收所使用的时间上限
记忆集
每个分区都维护有一个记忆集列表,其它分区存储的对象A如果引用了当前分区里的对象,那当前分区里的记忆集就会存储对象A的引用信息,记忆集就是类似A对象的引用的集合
维护记忆集,引用数据类型赋值操作时,会检测目标对象实体和当前对象实体是不是在一个分区,不在一个分区的话,会维护目标分区的记忆集信息,每个分区进行垃圾标记的时候,记忆集里面的对象引用信息也会被当作根来处理
适用场景
适用配备多核处理器与大容量内存的物理设备部署服务
优先保证响应速度/低延时的同时,释放执行引擎的吞吐能力/吞吐量
硬性平衡点指标是当堆内存大小在6-8G的时候,CMS和G1的性能表现相当,当堆内存大小大于这个配置的时候,G1的性能表现优于CMS
使用G1垃圾收集器的标准操作流程
开启G1垃圾收集器
-XX:+UseG1GC
设置堆的最大内存
设置最大的停顿时间
G1垃圾回收场景和关键特点介绍
单独回收年轻代角色的分区
垃圾收集线程并行处理,垃圾收集线程独占处理不允许用户线程执行,操作所有年轻代角色分区,涉及的年轻代角色分区不受响应时间限制
混合回收年轻代和老年代角色的分区(堆内存使用达到一个阈值是开始混合回收流程)
第一阶段
老年代角色的分区并发标记过程(用户线程可以并行执行)
第二阶段
混合回收过程,涉及所有年轻代角色的分区,涉及到的老年代角色的分区数量受限于响应速度要求,不需要保证所有老年代角色分区被回收
网友评论