public class GcTest
{
public static void main(String[] args)
{
for (int i = 0 ; i < 4; i++)
{
new GcTest();
// 下面两行代码的作用完全相同,强制系统进行垃圾回收
// System.gc();
Runtime.getRuntime().gc();
}
}
public void finalize()
{
System.out.println("系统正在清理GcTest对象的资源...");
}
}
java -verbose:gc GcTest
finalize()方法具有如下4个特点:
永远不要主动调用某个对象的finalize()方法,该方法交给垃圾回收机制调用。
finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当成一定会被执行的方法。
当JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中其他对象重新变成可达状态。
当JVM执行finalize()方法时出现异常时,垃圾回收机制不会报告异常,程序继续执行。
public class FinalizeTest
{
private static FinalizeTest ft = null;
public void info()
{
System.out.println("测试资源清理的finalize方法");
}
public static void main(String[] args) throws Exception
{
// 创建FinalizeTest对象立即进入可恢复状态
new FinalizeTest();
// 通知系统进行资源回收
// System.gc(); //①
// 强制垃圾回收机制调用可恢复对象的finalize()方法
// Runtime.getRuntime().runFinalization(); //②
System.runFinalization(); //③
ft.info();
}
public void finalize()
{
// 让tf引用到试图回收的可恢复对象,即可恢复对象重新变成可达
ft = this;
}
}
java对象的强引用,软引用,弱引用,虚引用