2 自动垃圾内存管理机制-1 识别垃圾对象

两种方法,引用计数算法,可达性分析算法

1 引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

1.1 存在问题:

它很难解决对象之间相互循环引用的问题。

1.2 问题讲解

我们删除了对象的所有的外部引用,那么对象应该要被垃圾回收,但是由于引用计数器不为1(对象相互引用导致的),所以,这些objA和objB仍然不能被回收。

2 可达性分析法

该算法的基本思路就是通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。对象无法作为根节点,所以,克服了对象自引用问题。主流的语言都是采用这种方法。

2.1 可作为GC Root的对象:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象

  • 方法区中类静态属性引用的对象

  • 方法区中常量引用的对象

  • 本地方法栈中JNI(即一般说的Native方法)引用的对象

2.2 Java识别垃圾对象的实例

(1)代码

package Chapter3;

public class ReferenceCounting {

       

       public Object instance=null;

       

       private static final int _1MB=1024*1024;

       

       private byte[]bigSize=new byte[2*_1MB];

       

       public ReferenceCounting() {

       }

       public static void main(String[] args) {

              

              ReferenceCounting objA=new ReferenceCounting();

              ReferenceCounting objB=new ReferenceCounting();

              objA.instance=objB;

              objB.instance=objA;

              objA=null;

              objB=null;

              System.gc();

              

       }

}

(2)查看java使用哪种垃圾回收方法

配置参数

查看结果,采用的是可达性分析的方法

发布了146 篇原创文章 · 获赞 91 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/A1342772/article/details/90523774