前言
当前垃圾回收集器大多都是遵循分代收集理论进行设计的,先聊聊什么是分代收集:
(1)弱分代假说:绝大多数对象都是朝生夕灭的;
(2)强分代假说:熬过多次垃圾收集过程的对象就越难消亡;
(3)跨代引用假说:跨代引用相对于同代引用来说仅占极少数。
Java堆一般被分为两个区域:新生代和老年代。根据不同区域的垃圾收集,设计了不同的垃圾收集器:
(1)新生代收集(Minor GC / Young GC)
(2)老年代收集(Major GC / Old GC)
(3)混合收集(Mixed GC)
(4)整堆收集(Full GC)
ok,我们回归正题,Java虚拟机中有哪些垃圾回收算法呢?
- 标记-清除算法(Mark-Sweep)
- 标记-复制算法(Mark-Copy)
- 标记-整理算法(Mark-Compact)
标记-清除 算法
如图所示,标记-清除算法进行2步操作:
Step1:标记出需要回收的对象(图中红色);
Step2:统一回收掉被标记的对象(红色改灰色)。
标记-清除 的缺点:可用内存缩小了一半,浪费空间比较多。
标记-复制 算法
如图所示,标记-复制算法进行4步操作:
Step1:将内存划分成相等的两块,只使用其中一块;
Step2:标记出需要回收的对象(图中红色);
Step3:将存活的对象复制到另外一块内存区(图中:左边复制到右边);
Step4:清理掉刚使用过的那块内存区(红色改灰色)。
标记-复制 的缺点:在对象存活率高时,需要进行很多复制操作,效率会降低。
标记-整理算法
如图所示,标记-整理算法进行3步操作:
Step1:标记出需要回收的对象(图中红色);
Step2:将存活的对象移向内存一端;
Step3:清除掉其它内存(除移动的内存外,全改为灰色)。
标记-整理 的缺点:存在大量存活对象的区域,移动存活对象是一个很负重的操作,而且对象移动操作必须全程暂停用户应用程序,会造成“Stop The Word”现象。
总结
3种垃圾回收算法各有其优缺点,设计者们在设计的时候根据不同区域对象的特点选择合适的算法,如:
CMS收集器基于 标记-清除 算法;
Serial、ParNew收集器基于 标记-复制算法;
Parallel Scavenge收集器基于 清除-整理 算法。
此笔记主要是记录几个算法的基本思想,文中3张图是本文的核心思想,对于许多细节没有展开!