gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java垃圾回收之标记清除算法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

概念介绍 。

root对象 。

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

  1. 被栈中的变量(栈中存的是对象的引用)所引用的对象
  2. 被static变量引用的对象

可访问的对象 。

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

标记清除算法介绍 。

该算法有两个阶段.

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

备注:

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

标记阶段算法 。

伪代码类似如下:

?
1
2
3
for each root variable r
   mark (r);
sweep ();

为了能够区分对象是live的,可以为每个对象添加一个marked字段,该字段在对象创建的时候,默认值是false 。

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

?
1
2
3
4
5
void mark(object p)
   if (!p.marked)
     p.marked = true ;
     for each object q referenced by p
       mark (q);

这个mark方法只有当所有对象已经被mark后才会退出.

清除阶段算法 。

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

伪代码如下:

?
1
2
3
4
5
6
void sweep ()
   for each object p in the heap
     if (p.marked)
       p.marked = false
     else
       heap.release (p);

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

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

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

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

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

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

解决循环引用 。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class testa{
  public testb b;
}
class testb{
  public testa a;
}
public class main{
   public static void main(string[] args){
     a a = new a();
     b b = new b();
     a.b=b;
     b.a=a;
     a = null ;
     b = null ;
   }
}

对应的图如下:

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

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

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

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

总结 。

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

原文链接:https://blog.csdn.net/linsongbin1/article/details/51577310 。

最后此篇关于Java垃圾回收之标记清除算法详解的文章就讲到这里了,如果你想了解更多关于Java垃圾回收之标记清除算法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com