6.垃圾收集算法
6.1 标记清除算法(Mark-Sweep)
首先标记处需要回收的对象(见4),再统一回收所有被标记的对象。
特点:
- 效率低(标记和清除过程效率都低);
- 会产生大量不连续的空间碎片。
6.2 复制算法(Copying)
将可用内存按容量划分为两块,每次只是用一块。当这块内存用完了,就将活着的对象复制到另一块,已使用的内存空间一次性清理掉。
特点:
- 无内存碎片,简单高效;
- 内存缩小为一半,代价较高。
6.3 标记整理算法(Mark-Compact)
标记需要回收的对象,将所有存活的对象向一端移动,直接清理掉边界外的内存。
特点:
- 没有内存碎片
- 需要移动对象的成本
6.4 分代收集算法
7. 垃圾收集器
-
Serial收集器(新生代,老年代有不同的版本)
- 新生代(Serial New)复制算法,老年代(Serial Old)采用标记-整理算法;
- 单线程,工作时会暂停其他所有工作线程(“Stop The World”)。
- 开启参数: -XX: +UseSerialGC 开启后新生代使用Serial New,老年代使用Serial Old。
-
ParNew收集器 (即Parallel for New Generation)
-
多线程工作,原理与Serial一样
-
开启参数: -XX: +UseParNewGC ,开启后新生代使用ParNew(复制算法),老年代使用Serial Old(标记-整理算法),默认开启与CPU数目相同的线程数。
这种组合JDK8中已被deprecated。
-
-
Parallel Scavenge收集器(新生代)
- 多线程工作,吞吐量优先原则;
- 自适应调节策略:虚拟机会根据当前系统运行情况动态调整参数来提供最合适的停顿时间或最大吞吐量;
- 开启参数:-XX: +UseParallelGC或-XX:+UseParallelOldGC,新生代复制算法,老年代使用ParOld收集器(标记-整理算法)
-
并发标记清除垃圾收集器(CMS,Concurrent Mark Sweep)
-
用户线程和垃圾收集线程同时执行(并发,可能是交替执行),最短停顿时间原则;
存在内存碎片;
-
采用标记-清除算法;
-
开启参数:+XX: +UseConcMarkSweeoGC,开启后新生代使用ParNew,老年代使用CMS(Serial Old作为后备收集器)
-
初始标记(Stop) —> 并发标记(并发) —> 重新标记(Stop)- ----> 并发清除(并发)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-werL5FJX-1583509328067)(C:\Users\weitu\AppData\Roaming\Typora\typora-user-images\1583497124691.png)]
-
-
G1垃圾收集器 见9
如何选择垃圾收集器?
单CPU,小内存:SerialGC
多CPU,大吞吐量:ParallelScavenge
多CPU,快速响应:CMS