一、介绍

当程序创建对象、数组等引用类型实体时,系统会在堆内存中位置分配一块内存区,对象就保存在其中,当这块内存不再被任何变量引用时,就成为了垃圾,等待垃圾回收机制回收。

垃圾回收机制的特点:

1、只回收堆内存的资源,不回收物力资源(如数据库连接,网络IO等)

2、回收任何对象之前,先调用他的finalize()方法,该方法可能使对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。

二、对象在内存中的状态

释放java缓存的命令 java如何释放对象_内存

当某个对象被其他类的类变量引用时,只有该类被销毁后,该对象才进入可恢复状态。被其他对象的实例变量引用时,只有该对象被销毁后,该对象才进入可恢复状态。

三、强制垃圾回收

通知系统进行垃圾回收,但系统是否进行回收并不确定。有如下两种方式:

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类实现, 类似于完全没有引用,主要用于跟踪对象被垃圾回收的状态。