垃圾回收

来源:互联网 发布:天然气物性计算软件 编辑:程序博客网 时间:2024/04/28 18:07
public class Gc {private static Gc a=null;private void info(){System.out.println("info()");}public static void main(String[] args) {new Gc();//System.gc(); 也可以Runtime.getRuntime().gc();a.info();}@Overrideprotected void finalize() throws Throwable {a=this;}}


结果:



在看下面这种情况:

public class Gc {private static Gc a=null;private void info(){System.out.println("info()");}public static void main(String[] args) {new Gc();//System.gc(); 也可以Runtime.getRuntime().gc();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}a.info();}@Overrideprotected void finalize() throws Throwable {a=this;}}

结果:



为什么会出现这种情况呢?

程序中我们new了一个匿名对象,由于没有赋值给任何变量,所以该对象立即进入了可恢复状态,我们System.gc()后,垃圾回收器其实是不能立即进行回收,否则就会调用finalize方法;所以当我们调用了sleep后,垃圾回收器会受到程序的通知,因此开始进行垃圾回收,调用可恢复对象的finalize方法,让a指向匿名对象。



0 0