共计 1392 个字符,预计需要花费 4 分钟才能阅读完成。
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()==");
}
}
运行成果:
如下图所示: