GC基础知识
-
什么是垃圾
没有任何引用指向的一个对象或多个对象(循环引用)
![[图片上传失败...(image-b28203-1648985605794)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/8a4436f6cL.png)
-
如何找到垃圾
- 引用计数(ReferenceCount),缺点:无法解决循环引用
- 根可达算法(RootSearching),从根开始查找,找到对象是有用的,找不到的对象为垃圾。
![[图片上传失败...(image-142db9-1648985605794)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/UfI97KHJ57.png)
-
常见的垃圾回收算法
- 标记清除(mark sweep)
缺点:位置不连续,产生碎片,效率偏低(需要进行两遍扫描)
适用情况:算法相对简单,适用于存活对象比较多的情况
![[图片上传失败...(image-285ecb-1648985605784)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/D9J8BUB33R.png)
-
拷贝算法 (copying)
说明:没有碎片,浪费空间,复制移动对象,需要调整对象引用
适用情况:适用于存活对象较少的情况 只扫描一次
![[图片上传失败...(image-f54373-1648985605780)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/OYGda897c6.png)
-
标记压缩(mark compact)
说明:没有碎片,效率偏低(两遍扫描,指针需要调整)
![[图片上传失败...(image-1d73e5-1648985605784)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/8FX85NQ161.png)
-
JVM堆内存分代模型(用于分代垃圾回收算法)
堆内存分代模型是部分垃圾回收器使用的模型,除Epsilon ZGC Shenandoah 之外的GC都使用逻辑分代模型,但是G1 是逻辑分代 物理不分代,除此之外都是逻辑分代 而且物理分代。
![[图片上传失败...(image-34a72c-1648985605784)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/7a3d76F60c.png)
-
垃圾回收类型和对象分配过程
-
垃圾回收类型
上一个点解释了堆内存分代模型,这里统一下概念:MinorGC=YGC指的是新生代即Y区的垃圾回收,MajorGC=FGC指的是老年代分配不下或是满了发生的GC,包括新生代和老年代。
-
对象如何分配
-
![[图片上传失败...(image-358c09-1648985605793)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/KdK12HF2c1.png)
对照流程图,分配过程:
> 1. new对象后优先在栈上分配,栈上分配的对象`pop`后就消失;
> 2. 是否是大对象(Y区分配不下的对象)?是就分配到O区,O区发生FGC后回收
> 3. 不是大对象,优先分配TLAB(Thread Local Allocation Buffer线程本地分配缓存)上,分配不下就分配到Eden区 。
-
了解栈上分配、TLAB、分配担保机制和升代
-
常见的垃圾回收器
常见的垃圾回收器有Serial/SerialOld、ParallelScavenge/ParallelOld、ParNew/CMS、G1、ZGC、Shenandoah、Epsilon。Serial/SerialOld、ParallelScavenge/ParallelOld、ParNew/CMS是分代的垃圾回收器,G1是逻辑上分代物理上不分代,ZGC和Shenandoah是不分代,Epsilon是JDK调试用的垃圾回收器。
历史:JDK诞生,Serial追随,为了提供效率诞生PS,为配合CMS,诞生PN,CMS是1.4后期引入的,CMS是里程碑式的GC,但是CMS毛病比较多,因此目前没有任何一个JDK版本默认CMS。
![[图片上传失败...(image-b0b30-1648985605793)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/24F360H422.png)
-
Serial
年轻代 串行回收
![[图片上传失败...(image-a1b33b-1648985605783)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/b63cRL17E4.png)
-
SerialOld
老年代 串行回收
![[图片上传失败...(image-f30947-1648985605783)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/SZW03Ca37f.png)
-
PS(ParallelScavenge)
年轻代 并行回收
![[图片上传失败...(image-209182-1648985605783)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/4PJPJ9O0aN.png)
-
PO(ParallelOld)
老年代 并行回收
![[图片上传失败...(image-15ee98-1648985605783)]](https://file.cfanz.cn/uploads/png/2022/04/03/11/4PJPJ9O0aN.png)
-
PN(ParNew)
年轻代 增强版PS配合CMS的并行回收。PN 和 PS区别?PN 响应时间优先;PS吞吐量优先
-
CMS(ConcurrentMarkSweep)
老年代并发的,垃圾回收和应用程序同时运行,降低STW的时间(200ms);
CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定;
CMS既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程度,CMS的老年代分配对象分配不下的时候,使用SerialOld 进行老年代回收,STW无法忍受;
使用的算法:三色标记+Increamental Update
-
G1
STW可以达到10ms
算法:三色标记+SATB
-
ZGC
STW号称可以达到1ms
算法:颜色指针ColoredPointers + LoadBarrier
-
Shenandaoh
算法:ColoredPointers + WriteBarrier
-
垃圾回收器和内存大小的关系
Serial 几十兆
PS 上百兆-几个G
CMS 20G左右
G1 上百G
ZGC 4T-16T(JDK13可以支持)









