JVM垃圾收集器总结

一.经典的垃圾收集器:

Serial收集器:

(1)最基础最悠久的收集器
(2)工作在新生代:复制算法 
(3)Stop the World

ParNew收集器

(1)多线程版的Serial
(2)可以与CMS配合使用
(2)工作在新生代

Parallel Scavenge收集器

(1)和前两款收集器相比,更注重吞吐量。(前两款注重垃圾收集时间)
(2)-XX:MaxGCPauseMillis 	收集器将尽量使得每次的收集时间小于此参数,参数值越小,垃圾收集越频繁
(3)-XX:GCTimeRatio 
(4)自动调整参数的策略叫做自适应的调节策略
(5)工作在新生代
(6)多线程

Serial Old

(1)老年代的Serial
(2)工作在老年代:标记整理算法 

Parallel Old

(1)Parallel Scavenge的老年代版本

CMS收集器

(1)以最短回收停顿时间为目标的收集器
(2)工作在老年代,标记清除算法
(3)并发低停顿收集器
(4)多核机器表现良好,核心不足则表现较差
(5)i-CMS用在核心不足的机器上以提升性能,但是效果不佳
(6)可能因为无法处理浮动垃圾而启动Serial Old进行老年代的垃圾收集
(7)工作步骤:
	初始标记(STW)
	并发标记
	重新标记(STW) :增量更新
	并发清理

Garbage First(G1)

(1)工作在新生代和老年代,但内存分区不在固定,G1将内存划分为多个CSet,专注于垃圾多的地方
(2)JDK9 开始为默认垃圾收集器
(3)基于Region的堆内存布局,每一个Region的分代不固定
(4)超过一个Region一半的对象为大对象,发在Humongous Region中
(5)由于存在跨Region的引用,每个region都要维护一个双向卡表,G1需要耗费Java堆容量的10%~20%,比一般垃圾收集器占用内存更多
(6)TAMS :每个Region两个,用于新对象的创建
(7)工作步骤:
	初始标记
	并发标记:仅此不需要暂停用户线程
	最终标记:原始快照
	筛选回收

二.低延迟的垃圾收集器

Shenandoah

非官方收集器

(1)连接矩阵:代替了记忆集 (这东西就是图论中的连接矩阵)	

(2)工作阶段
	初始标记  :  用于标记GC ROOT (STW)
	并发标记  :  标记出全部可达对象
	最终标记  :  
	并发清理  :  清理完全没有存活对象的region
	并发回收  :  将存活对象移动到未使用的region
	初始引用更新:复制完之后更新引用,但这一步仅仅做了一个确认:所有复制任务都已经完成
	并发引用更新:真正开始的引用更新操作
	最终引用更新:更新GC root中的引用,STW
	并发清理 :  赋值完之后,清理赋值前的原对象
(2)  brooks point
	位于对象最前面的一个引用字段,不发生并发移动时指向自己.
	用于引用更新,之前对象移动时,通过保护陷阱解决问题

ZGC

ZGC收集器是一款基于Region内存布局的,不设分代的,使用了读屏障,染色指针和内存多重映射等技术实现可并发的标记整理算法的,以低延迟为首要目的的一款垃圾收集器.

(1)region
	小型region:2MB,对象<=256KB
	中型region:32MB,对象<=4MB
	大型region:一个region一个对象,总容量必须是2MB的倍数
(2)指针染色技术:
	使用地址指针的前四位进行标记.
	使用多重映射解决机器硬件不支持问题
(3)最大内存管理:   4TB
(4)工作阶段:
	并发标记:
	并发预备重分配:记录存活对象会被重新赋值到哪个region
	并行重分配:   自愈	转发表
	并发重映射:  更正所有的旧引用,实际放在并发标记完成
(5)支持 非统一内存访问架构(NUMA-Aware)

Epsilon

无操作
适用于小应用

总结

一个垃圾收集器收集垃圾,其实就是两个部分:
标记,清理
对于Serial,ParNew,Parallel Scavenge,Serial Old,Parallel Old这些收集器来说,工作阶段就是这两个
他们几个的区别,主要体现在工作区域和是否多线程
CMS的工作阶段有四个,初始标记,并发标记,重新标记,并发清除.你仔细一看,那还是标记和清理
G1的工作阶段与CMS相似,初始标记,并发标记,最终标记,筛选回收.与CMS的不同之处主要体现在内存布局,垃圾标记的算法之上
Shenandoah的工作阶段更多,初始标记,并发标记,最终标记,并发清理,并发回收,初始引用更新,并发引用更新,最终引用更新,并发清理. 这引用更新是为了解决移动对象时的STW问题

注意:
1.上图中的标记并发不包括枚举GC root,如果枚举GC root,一定要STW
2.使用标记复制,标记整理算法会引发STW,但是Shenandoah通过Brooks Pointer,ZGC通过染色指针和转发表解决了此过程STW问题

posted @ 2020-03-27 15:08  断腿三郎  阅读(307)  评论(0编辑  收藏  举报