把周末的文章放在如今才来写,是本身太忙了?仍是堕落了?算法
好吧直接进入主题吧,简单干脆的理解会让本身记忆深入:spa
首先说明:GC垃圾收集器关注两件事情:线程
第一件:查找全部存活对象。对象
第二件:抛弃死对象(再也不使用的对象)。blog
而后再分步骤解释这个过程:内存
第一步, 记录全部的存活对象, 在垃圾收集中有一个叫作 标记(Marking) 的过程专门干这件事。class
GC遍历内存中总体的对象关系图(object graph),从GC根元素开始扫描, 到直接引用,以及其余对象(经过对象的属性域)。全部GC访问到的对象都被标记(marked)为存活对象。object
注意:在标记阶段,须要暂停全部应用线程, 以遍历全部对象的引用关系。由于不暂停就无法跟踪一直在变化的引用关系图。这叫作 Stop The World pause (全线停顿)。遍历
第二步,GC删除不可达对象。引用
GC算法在删除不可达对象时略有不一样,总结以下:
一、标记-清除算法:直接忽略全部的垃圾。也就是说在标记阶段完成后, 全部不可达对象占用的内存空间, 都被认为是空闲的, 所以能够用来分配新对象。
优势:很是简单。
缺点:容易致使内存分配失败。
二、标记-清除-整理算法:将全部被标记的对象(存活对象), 迁移到内存空间的起始处, 消除了标记-清除算法的缺点。
优势:解决了内存分配失败。
缺点:GC暂停的时间增加,须要将全部的存活对象移动到另外一个地方。
三、标记-清除-复制算法:将将全部被标记的对象(存活对象)移动到另一个空间: 存活区。
优势:标记和复制能够同时进行。
缺点:须要一个额外的内存区间来存放全部的存活对象。