findlize 和GC垃圾回收器的区别

一:findlize方法

        Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 之所以要使用finalize(), 是存在着垃圾回收器不能处理的特殊情况 。假定你的对象(并非使用new方法)获得了一块“特殊”的内存区域,由于 垃圾回收器只知道那些显示地经由new分配的内存空间 ,所以它不知道该如何释放这块“特殊”的内存区域,那么这个时候java允许在类中定义一个由finalize()方法。这种情况主要发生在native method中,比如native method调用了C/C++方法malloc()函数系列来分配存储空间,但是除非调用free()函数,否则这些内存空间将不会得到释放,那么这个时候就可能造成内存泄漏。但是由于free()方法是在C/C++中的函数,所以finalize()中可以用本地方法来调用它。以释放这些“特殊”的内存空间。finalize()的主 要用途是释放一些其他做法开辟的内存空间 ,以及 做一些清理工作 。

finalize()方法的优缺点:

      (1):根据 Java 文档,finalize() 是一个用于释放非 Java 资源的方法。但是,JVM 有很大的可能不调用对象的finalize() 方法,因此很难证明使用该方法释放资源是有效的。

     (2):Java 1.1 通过提供一个System.runFinalizersOnExit() 方法部分地解决了这个问题。(不要将这个方法与 Java 1.0 中的System.runFinalizations() 方法相混淆。)不象System.gc() 方法那样,System.runFinalizersOnExit() 方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize() 方法。

猜你喜欢

转载自blog.csdn.net/Da_Bao_zi/article/details/121386478