Java垃圾回收之标记清除算法详解

  

java垃圾回收算法之——引用计数器,这个算法其中一个优点便是,实时性,只要对象的引用计数器的值为0,则立刻回收。接下来介绍的标记清除算法,当对象的引用计数器的值为0时,不会立刻被回收的。

  

<强>概念介绍

  

<强>根对象

  

在标记清除算法中,会把如下对象称之为根对象

  
      <李>被栈中的变量(栈中存的是对象的引用)所引用的对象李   <李>被静态变量引用的对象李   
  

<强>可访问的对象

  

如果栈中有一个变量一个引用了一个对象,那么该对象是可访问的,如果该对象中的某一个字段引用了另一个对象b,那么b也是可访问的。可访问的对象也称之为<代码>生活>   

<强>标记清除算法介绍

  

该算法有两个阶段。
  

  

1。标记阶段:找到所有可访问的对象,做个标记
  2. 清除阶段:遍历堆,把未被标记的对象回收

  

备注:

  
      <李>该算法一般应用于老年代,因为老年代的对象生命周期比较长。   
  

<强>标记阶段算法

  

伪代码类似如下:

        每根变量r   马克(r);   扫描();      

为了能够区分对象是活的,可以为每个对象添加一个标志字段,该字段在对象创建的时候,默认值是假
  

  

假设有一个对象p, p对象还间接的引用了其他对象,那么可以使用一个递归算法去进行标记,例如:

        空白马克p(对象)   如果(! p.marked)   p。标志=true;   为每一个对象引用的p   马克(q);      

这个马克方法只有当所有对象已经被标记后才会退出。

  

<强>清除阶段算法

  

在这个阶段,需要去遍历堆中所有对象,并找出未被标记的对象,进行回收。与此同时,那些被标记过的对象的标记字段的值会被重新设置为false,以便下次的垃圾回收。
  

  

伪代码如下:

        真空扫描()   为每个对象在堆中p   如果(p.marked)   p。标志=false   其他的   堆。发布(p),      

下面用一张图来表示标记清除算法的整个过程。

  

癑ava垃圾回收之标记清除算法详解"

  

标记清除算法的优点和缺点

  

1。优点
  ——是可以解决循环引用的问题
  ——必要时才回收(内存不足时)

  

2。缺点:
  ——回收时,应用需要挂起,也就是阻止世界。
  ——标记和清除的效率不高,尤其是要扫描的对象比较多的时候
  ——会造成内存碎片(会导致明明有内存空间,但是由于不连续,申请稍微大一些的对象无法做的到),如下图:

  

癑ava垃圾回收之标记清除算法详解"

  

<>强解决循环引用
  

  

出现循环引用的代码如下:

        甲壳类{   公共的b;   }   类的{   公共外种皮;   }   公开课主要{   公共静态void main (String [] args) {   一个=new ();   B B=new ();   a.b=b;   本科=一个;   一个=零;   b=零;   }   }      

对应的图如下:

  

癑ava垃圾回收之标记清除算法详解"

  

这个时候,当=零;b=零;的时候,图像变成如下:

  

癑ava垃圾回收之标记清除算法详解"

  

那么使用标记清除算法是可以回收a和b的,原因是标记清除算法是从栈中根对象开始的,改算法走完后,一个对象和b对象是没有被标记的,会被直接回收。

  

<强>总结

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接

Java垃圾回收之标记清除算法详解