乐趣区

关于java:GC垃圾回收机制基本过程理解

GC

GC 全拼是 Garbage Collectio, 是指计算机技术中的垃圾回收零碎,Java 语言就是自带垃圾回收零碎的一门语言, 那么在程序运行中, 到底是怎么回收的呢?

何为垃圾?

要理解 java 中的 GC 垃圾回收零碎, 当然要先了解在 java 中什么样的数据或对象会被 GC 断定为 ” 垃圾 ”.

可达性:
首先须要理解一个概念, 叫做 ” 可达性 ”

class ClassA{}

public class TestGC{ClassA class1 = new ClassA();
}

在下面这行简略易懂的代码中, 咱们能够看到 new 出的 ClassA 对象是被后面的 ”ClassA class1″ 所援用的.

当对象实例有援用指向时, 就是指这个对象 ” 可达 ”;

class ClassA{}

public class TestGC{ClassA class1 = new ClassA();
    class1 = null;
}

而如果咱们将这个申明指向 null, 且在这个类中没有其余的援用去指向之前的 ”new ClassA()”, 那它就是 ” 不可达的 ”.

当没有任何援用 (如: 池中是否有该对象) 指向此对象, 就是指这个对象 ” 不可达 ”, 这时这个对象就会被 JVM 认为是 ” 垃圾 ”.

GC 零碎回收的启动

GC 零碎回收的启动形式分为两种: 手动启动 / 主动启动

手动启动:
通过 ”System.gc();” 语句来手动开始 GC.
当你开启 GC, 且 ”System.gc();” 之前存在 ” 垃圾对象 ”, 那么就会对 ” 垃圾对象 ” 进行销毁回收, 开释内存资源.

class ClassA{}

public class TestGC{ClassA class1 = new ClassA();
    class1 = null;
    System.gc();}

主动启动:
零碎底层会随着创建对象的减少, 占用内存的减少, 基于内存状况, 来主动启动 GC.
简而言之, 就是内存不足时, 会主动开启 GC, 如果之前存在 ” 垃圾对象 ”, 那么就会对 ” 垃圾对象 ” 进行销毁回收, 开释内存资源.

class ClassA{}

public class TestGC{ClassA class1 = new ClassA();
    class1 = null;
    
    List<byte[]> list=new ArrayList<>();
    for(int i=0;i<100000;i++) {list.add(new byte[1024*1024]);
    }
}

在上述代码中, 通过创立汇合, 且一直向其中增加数组的模式, 来模仿内存不足, 主动开启 GC 的状况, 当这种状况产生时, 且 class1 指向 null,new ClassA()没有援用指向,GC 就会主动将垃圾对象 –new ClassA()进行回收开释内存.

测试运行

当咱们在运行上述代码时, 如果是这样运行, 运行后果是空白的, 看不出到底 GC 有没有启动.

GC 是否启动:
通过配置 JVM 参数:
在类中右键 ->Run As->Run Configurations->Arguments->VM arguments 中输出:-XX:+PrintGC
配置后在控制台中, 就能够看到 GC 启动的成果

对象是否被 GC:
在对象类中, 通过重写 Object 类的 finalize 办法进行显示

class ClassA{
    /** 对象在被回收前会执行此办法 */
    @Override
    protected void finalize() throws Throwable {System.out.println("==finalize()==");
    }
}

运行成果:
如下图所示:

退出移动版