若是finalize()抛出异常会怎样?

finalize()抛出异常的时候会被忽略。并且,对象的终结将在此中止,致使对象处在一种不肯定的状态。若是另外一个进程试图使用这个对象的话,将产生不肯定的结果。一般抛出异常将会致使线程终止并产生一个提示信息,可是从finalize()中抛出异常就不会。java

我想实践一下finalize()方法,能提供一个范例吗?数组

class LargeObject
{
   byte[] memory = new byte[1024*1024*4];
 
   @Override
   protected void finalize() throws Exception
   {
      System.out.println("finalized");
   }
}
 
public class FinalizeDemo
{
   public static void main(String[] args)
   {
      while (true)
         new LargeObject();
   }
}

代码清单1:实践finalize()

代码清单1中的代码写了一个FinalizeDemo程序,重复地对largeObject类实例化。每个Largeobject对象将产生4M的数组。在这种状况下,因为没有指向该对象的引用,因此LargeObject对象将被GC回收。ide

GC会调用对象的finalize()方法来回收对象。LargeObject重载的finalize()方法被调用的时候会想标准输出流打印一条信息。它没有调用父类的finalize()方法,由于它的父类是Object,即父类的finalize()方法什么也不作。spa

编译(javac FinalizeDemo.java)并运行(java FinalizeDemo)代码清单1.当我在个人环境下(64位win7平台)使用JDK7u6来编译运行的时候,我看到一列finalized的信息。可是在JDK8的环境下时,在几行finalized以后抛出了java.lang.OutOfMemoryError线程

由于finalize()方法对于虚拟机来讲不是轻量级的程序,因此不能保证你必定会在你的环境下观察到输出信息。code

相关文章
相关标签/搜索