一、介绍
当程序创建对象、数组等引用类型实体时,系统会在堆内存中位置分配一块内存区,对象就保存在其中,当这块内存不再被任何变量引用时,就成为了垃圾,等待垃圾回收机制回收。
垃圾回收机制的特点:
1、只回收堆内存的资源,不回收物力资源(如数据库连接,网络IO等)
2、回收任何对象之前,先调用他的finalize()方法,该方法可能使对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。
二、对象在内存中的状态
当某个对象被其他类的类变量引用时,只有该类被销毁后,该对象才进入可恢复状态。被其他对象的实例变量引用时,只有该对象被销毁后,该对象才进入可恢复状态。
三、强制垃圾回收
通知系统进行垃圾回收,但系统是否进行回收并不确定。有如下两种方式:
1、调用System的gc()静态方法:System.gc()
2、调用Runtime对象的gc()实例方法:Runtime.getRutime().gc()
public class GcTest {
public static void main(String[] args) {
for(int i=0;i<4;i++){
new GcTest();
Runtime.getRuntime().gc();
}
}
@Override
protected void finalize() throws Throwable {
// TODO 自动生成的方法存根
super.finalize();
System.out.println("进行垃圾回收");
}
}
四、finalize()方法
1、永远不要主动调用某个对象的finalize()方法,该方法应该主动交给垃圾回收机制调用
2、finalize()方法合适,是否被调用具有不确定性,不要纪委finalize()方法时一种一定会执行的方法
3、JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中其他对象重新变为可达状态
4、JVM执行finalize()方法出现异常时,不会报告异常,继续执行
五、对象的软、弱、虚引用
1、强引用
最常见,创建一个对象,赋给一个引用变量,通过该引用变量操作实际对象。当对象被一个或多个引用变量引用时,处于可达状态,不会被回收。
2、软引用
通过SoftReference类实现, 当内存充足时,不会被回收,内存不足时可能会回收,通常用户与内存敏感的程序中。
3、弱引用
通过WeakReference类实现, 和软引用很象,但级别更低,对于只有弱引用的对象,不管内存够不够,当系统垃圾回收机制运行时,总会回收该对象的内存。
4、虚引用
通过PhantomReference类实现, 类似于完全没有引用,主要用于跟踪对象被垃圾回收的状态。