GC--垃圾收集器

把周末的文章放在如今才来写,是本身太忙了?仍是堕落了?算法

好吧直接进入主题吧,简单干脆的理解会让本身记忆深入:spa

首先说明:GC垃圾收集器关注两件事情:线程

第一件:查找全部存活对象。对象

第二件:抛弃死对象(再也不使用的对象)。blog

 

而后再分步骤解释这个过程:内存

第一步, 记录全部的存活对象, 在垃圾收集中有一个叫作 标记(Marking) 的过程专门干这件事。class

GC遍历内存中总体的对象关系图(object graph),从GC根元素开始扫描, 到直接引用,以及其余对象(经过对象的属性域)。全部GC访问到的对象都被标记(marked)为存活对象。object

注意:在标记阶段,须要暂停全部应用线程, 以遍历全部对象的引用关系。由于不暂停就无法跟踪一直在变化的引用关系图。这叫作 Stop The World pause (全线停顿)。遍历

第二步,GC删除不可达对象。引用

GC算法在删除不可达对象时略有不一样,总结以下:

一、标记-清除算法:直接忽略全部的垃圾。也就是说在标记阶段完成后, 全部不可达对象占用的内存空间, 都被认为是空闲的, 所以能够用来分配新对象。

优势:很是简单。

缺点:容易致使内存分配失败。

 

二、标记-清除-整理算法:将全部被标记的对象(存活对象), 迁移到内存空间的起始处, 消除了标记-清除算法的缺点。

优势:解决了内存分配失败。

缺点:GC暂停的时间增加,须要将全部的存活对象移动到另外一个地方。

 

 

三、标记-清除-复制算法:将将全部被标记的对象(存活对象)移动到另一个空间: 存活区。

优势:标记和复制能够同时进行。

缺点:须要一个额外的内存区间来存放全部的存活对象。

相关文章
相关标签/搜索