一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
垃圾收集的几种算法:复制算法、标记-清除、标记-整理、分代回收
Mark-Sweep(标记-清除)算法
算法分为"标记"和“清除”两个阶段:首先扫描所有对象标记出需要回收的对象,在标记完成后扫描回收所有被标记的对象,所以需要扫描两遍。回收效率略低,如果大部分对象是朝生夕死,那么回收效率降低,因为需要大量标记对象和回收对象
缺点:标记清除之后会产生大量不连续的内存碎片,当需要分配较大对象时,无法找到足够的连续空间。回收的时候如果需要回收的对象越多,需要做的标记和清除的工作越多,所以标记清除算法适用于老年代。
复制算法
解决了标记-清除算法带来的碎片问题。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。 缺点:浪费内存
Mark-Compact(标记-整理)算法
首先标记出所有需要回收的对象,在标记完成后,后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
缺点:内存碎片,但是效率偏低
Serial、Parallel Scavenge、ParNew 新生代 复制算法
Serial Old、Parallel Old 老年代 标记-整理算法 CMS 老年代 清除算法
G1 标记整理 Region(逻辑上划分新生代、老年代)
分代回收
一般情况下新生代、老年代采取不同的算法进行回收。
常用的收集器:CMS+ParNew
新生代对象存活时间短,存活量小适合复制算法;
老年代对象存活时间长,适合标记-清除、标记整理算法
CMS(Concurrent Mark Sweep)目标是降低用户交互时的延迟,采用了标记清除这种较快的算法,采用并发、多线程提高回收效率。