垃圾回收机制-标记清除

在垃圾回收的算法中,经常会出现mutator和collector两个名称,下面就对它做一下简单介绍。

(1).collector:指的就是垃圾收集器。

(2).mutator:指的是垃圾收集器之外的部分,比如当前的应用程序。它的功能是创建新对象,或者在内存读写内容。

(3).mutator roots:mutator根对象,通常是分配在堆内存之外,可以直接被mutator直接访问到的对象,一般是指静态/全局变量。

(4).可到达对象:所谓的可到达对象就是从根对象开始遍历,可以访问到的对象,也就是mutator(应用程序)正在使用的对象。

 

标记清除算法从名称上看,可以拆分为两部分:标记(mark)和清除(sweep)。

此算法可以分为两个阶段,一个是标记阶段,一个是清除阶段,下面就分别做一下介绍。

(1).标记阶段:

在此阶段,垃圾回收器会从mutator(应用程序)根对象开始遍历。

每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。

(2).清除阶段:

在此阶段中,垃圾回收器,会对堆内存从头到尾进行线性遍历,如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作

在标记阶段,从跟对想1可以访问到B,从B又可以访问到E,那么B和E都是可到达对象,同样的道理,F、G、J和K都是可到达对象。在回收阶段,所有未标记为可到达的对象都会被垃圾回收器回收。

特别说明:在垃圾回收阶段,应用程序的执行会暂停,等待回收执行完毕后,再恢复程序的执行。

posted @ 2019-07-31 11:47  二猫子  阅读(1459)  评论(1编辑  收藏  举报