- 相关概念
名称 |
说明 |
备注 |
GC |
Garbage Collection 垃圾回收 |
|
GC种类 |
MinorGC、MajorGC、YongGC、OldGC |
|
GC收集算法 |
标记清除算法、标记整理算法、复制回收算法 |
|
GC收集器 |
Serial、Parallel、CMS、G1、ZGC |
|
存活判断算法 |
引用计数算法、可达性分析算法 |
|
- 相关总结
在 Java虚拟机 中GC是一个重要的部分,我们可以看到在GC中有不少概念GC种类、GC收集算法、GC收集器、引用计数算法、可达性分析算法。原本就比较难懂这概念一多就有点乱了。下面一个图从总体上梳理了一下它们之间的相互关系。
1)整个垃圾回收可以分成两步:1、先判断对象是否存活;2、再回对象。
编辑
2)在整个垃圾回收各概念之间的关系
编辑
- GC收集器核心是GC收集算法
- GC收集算法一般先要判断对象是否存活就会用到引用计数算法或可达性分析算法
- 引用计数算法解决不了循环引用的情况,所以目前使用的都是可达性分析算法
- GC分为4个种类,作用在内存的不同区域(新生代Eden/S0/S1、老年代)。这时GC收集器会相互组合完成不同种类的GC,从而达到JVM GC的功能
1.3.1 GC过程
1)判断是否是垃圾
可以通过引用计数算法和可达性分析算法不判断,由于引用计数算法无法解决循环引用的问题,所以目前使用的都是可达性分析算法
2)遍历并回收垃圾
可以通过垃圾收集器(Serial/Parallel/CMS/G1)来回收垃圾,垃圾收集器使用的算法标记清除算法、标记整理算法、复制回收算法和分代回收算法。
1.3.2 GC种类
编辑
此图引用于网络
Minor GC |
[maɪnə] |
Eden |
Young GC |
|
Eden+S0+S1 |
Major GC |
[ˈmeɪdʒə(r)] |
Old |
Full GC |
|
Eden+S0+S1+Old |
1.3.3 GC三种收集方法:
标记清除 :先标记,标记完毕之后再清除,效率不高,会产生碎片
标记整理 :标记完毕之后,让所有存活的对象向一端移动
复制算法 :Eden区S0、S1 区比例为8:1:1 ,就是上面谈到的 YGC使用的就是复制回收算法。
1.3.4 GC收集器
1.3.4.1 收集器
1)Serial收集器
一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束。
特点: CPU 利用率最高,停顿时间即用户等待时间比较长。
适用场景:小型应用
通过 JVM 参数-XX:+UseSerialGC可以使用串行垃圾回收器。
2)Parallel收集器 (jdk8默认收集器)
采用多线程来通过扫描并压缩堆
特点:停顿时间短,回收效率高,对吞吐量要求高。
适用场景:大型应用,科学计算,大规模数据采集等。
通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。
3)CMS收集器
采用“标记-清除”算法实现,使用多线程的算法去扫描堆,对发现未使用的对象进行回收。
(1)初始标记
(2)并发标记
(3)并发预处理
(4)重新标记
(5)并发清除
(6)并发重置
特点:响应时间优先,减少垃圾收集停顿时间
适应场景:服务器、电信领域等。
通过JVM参数 -XX:+UseConcMarkSweepGC设置
4)G1收集器 (jdk17默认收集器)
在G1中,堆被划分成 许多个连续的区域(region)。采用G1算法进行回收,吸收了CMS收集器特点。
特点:支持很大的堆,高吞吐量
–支持多CPU和垃圾回收线程
–在主线程暂停的情况下,使用并行收集
–在主线程运行的情况下,使用并发收集
实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收
通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器
1.3.4.2 收集器对比
收集器 |
CMS |
G1 |
回收算法 |
标记清除 |
标记整理 |
回收区域 |
老年代 |
新生代+老年代 |
内存布局 |
传统 |
将新生代、老年代切一起分成一个个Region |
内存碎片 |
有 |
无 |
|
|
|