一个对象可以被一个方法的局部变量引用,也可以被其他类的类变量引用,或被其他对象的实例变量引用。如果被其他类的类变量引用时,只有该类被销毁后,该对象才会进入可恢复状态,当某个对象被其他对象的实例变量引用时,只有当该对象被销毁后,该对象才会进入可恢复状态。
程序只能控制一个对象何时不再被任何引用变量引用,绝不能控制它何时被回收。程序无法精确控制Java垃圾回收的时机,但我们依然可以强制系统进行垃圾回收 ---- 不过只是通知系统进行垃圾回收,系统到底回不回收还不确定。
强制垃圾回收的方法:
java -verbose:gc GcTest 命令: 运行Java命令时指定-verbose:gc选项,可以看到每次垃圾回收后的提示信息。
垃圾回收机制开始之前才会调用finalize方法,finalize方法返回后,对象消失,垃圾回收机制真正开始。不过垃圾回收机制何时调用finalize()方法是完全透明的,只有当内存不够时,垃圾回收机制才会进行垃圾回收。
特点:
public class FinalizeTest { private static FinalizeTest ft = null; public void info() { System.out.println("testing finalize()"); } public static void main(String[] args) throws Exception { new FinalizeTest(); System.gc(); Thread.sleep(2000);
// Thread.sleep 只是在等待系统调用finalize(),如果直接用runFinalization(), 就不用等待了
// Runtime.getRuntime().runFinalization()
// System.runFinalization()
ft.info(); } public void finalize() { ft = this; } }
main方法中创建了一个Finalize类的匿名对象,因为创建后没有任何引用指向它,所以它立即进入可恢复状态,系统调用gc通知进行垃圾回收,2s后,ft对象可以直接调用info方法。
原文:http://www.cnblogs.com/IvySue/p/6344145.html