对象被创建,就会在java虚拟机的堆区拥有一块内存,但是在java虚拟机工作时期,可能会有很多对象会被创建,所以如果对象都永久性的占用内存,资源就会被消耗。
java虚拟机就有了内存回收的任务,内存回收的过程称为垃圾回收。
通常堆区的对象都有三个状态:
1,可触及状态。对象创建后,只要程序中还有引用变量引用它,就属于这个状态。
2,可复活状态:程序中不再有引用变量引用该对象,它就进入了可复活状态,在这个状态,垃圾回收器会准备释放它占用的内存,释放之前,会调用它以及其他处于可复活状态的finalize()方法,该方法可能会使对象重新回到可触及状态。
3,不可触及状态:当对可复活状态的对象调用了finalize()方法后,如果该对象还没有转到可触及状态,那么该对象就会进入不可触及状态。就等着垃圾回收器来回收。
我看书上说,当一个对象处于可复活状态,垃圾回收线程何时执行它的finalize()方法,何时使它转到不可触及,何时回收占用的内存。这对程序都是透明的。
这好比我们丢垃圾,我们放到门外就可以,垃圾怎么收走,我们是不知道的。
这里还说说,Object类中的finalize()方法的特点。
1,由于是超类中的方法,所以任何类都可以复写。
2,垃圾回收器如果调用对象的finalize()方法时,发生异常,垃圾回收器不会报告异常,程序正常运行。
3,垃圾回收器是否会执行或何时执行该方法,都是不确定的。
|