可达性分析算法简介

概要

通过一系列的GC roots的对象为起始点,开始向下搜索,当一个对象到GC Roots没有任何引用相连,则证明

此对象为不可用,并将被判定为是可回收的对象。

那些对象可作为GC Roots对象?

被启动类(bootstrap加载器)加载的类和创建的对象

jvm运行时方法区类静态变量(static)引用的对象

jvm运行时方法区常量池引用的对象

jvm当前运行线程中的虚拟机栈变量表引用的对象

本地方法栈中(jni)引用的对象

分析

public class TestGC {

public Object instance;
private final static int _1M = 1024 * 1024; 
private byte[] bytesize =  new byte[2*_1M];

public static void testGC() {

    TestGC A = new TestGC();
    TestGC B = new TestGC();

    A.instance = B;
    B.instance = A;

    A = null;
    B = null;

    System.gc();
}

}
可达性分析算法即使存在互相引用的对象,但如果这两个对象无法访问到根对象,还是会被回收。

拓展

上面个提到的可达性分析算法中涉及的引用是指Java中的强引用。

Java将引用分为如下几种:

1.强引用:如Object obj = new Object();这类引用,便属于强引用,强引用存在则垃圾收集器不会回收

掉被引用的对象;

2.软引用:描述一些还有用但并非必须的对象。在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中

进行第二次回收,如果这次回收还是没有足够的内存,才会抛出内存溢出。

3.弱引用:描述非必须对象。被弱引用关联的对象只能生存到下一次垃圾收集发生之前。也就是,垃圾收集器工作时

,无论当前内存是否足够,都会回收掉被弱引用关联的对象。

4.虚引用:一个对象是否有虚引用的存在,完全不影响其生命周期,也无法通过虚引用来取得一个对象实例,

使用虚引用的目的是在这个对象被收集器回收时收到一个系统通知。

(以上仅为个人读书笔记,如有不当,欢迎指正!)

猜你喜欢

转载自blog.csdn.net/lovehalok/article/details/81146084
今日推荐