每个对象处于可触及(即有引用指向它)、可复活(不再引用指向它)以及不可触及三个状态,当进入到可复活状态时,垃圾回收期准备释放对象所占内存,而这之前先调用它的finalize()方法,它有可能是对象进入到可触及状态。如果执行完finalize()方法,对象没有进入可触及状态,垃圾回收期才会真正回收释放它占有的内存。
但是可复活状态的对象,垃圾回收器执行finalize()方法后什么时候能够转到不可触及状态以及回收内存都是透明的。
就好像:居民只把垃圾放到指定地方,等待清洁工人收走,但是垃圾什么时候收走居民是不知道的。
垃圾回收器作为低优先级的线程,程序无法迫使它立即执行垃圾回收操作。我们调用System.gc()方法或者Runtime.gc()通知强制回收,但是也不能保证就立即执行回收,也不能保证一定会执行垃圾回收操作。
这好像:当小区垃圾成堆通知环保局令其立即清扫垃圾,我们只能催促他们,增加尽快清理垃圾的可能性,但是仍有可能清洁工人很久之后才来或者一直没来清扫。 |