`

finalize()和gc()

    博客分类:
  • Java
 
阅读更多
引用
 

finalize()和gc()

(1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
回答:
gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内 存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行 内存回收就要靠finalize().
举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法 调用它(free()).
finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.









垃圾回收器负责回收所有无任何引用对象的内存空间。

注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身。

1. System.gc();   Runtime.getRuntime().gc() 这两种方法用于显示通知JVM可以进行一次垃圾回收,但垃圾回收机制具体在什么时间运行是无法预知的。

2.finalize() 方法 释放对象所占用的相关资源。

当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize()方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始终不会调用无用对象的finalize()方法。因为finalize()只有在垃圾回收器工作的时候才会被调用,也就是说,通过它进行资源释放并不能确保马上被释放,甚至可能根本不会被释放(因为垃圾回收器可能不会工作)。程序即使显式调用System.gc()或Runtime.gc()方法,也不能保证垃圾回收操作一定执行,因此不能保证无用对象的finalize()方法一定被调用。



关于finalize()方法:

java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。

      (1).对象不一定会被回收。
      (2).垃圾回收不是析构函数。
      (3).垃圾回收只与内存有关。
      (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。

     垃圾收集器在进行垃圾收集的时候会自动呼叫对象的finalize方法,用来进行一些用户自定义的非内存清理工作,因为垃圾收集器不会处理内存以外的东西。所以,有的时候用户需要定义一些清理的方法,比如说处理文件和端口之类的非内存资源。

      finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

      finalize()在什么时候被调用?

      有三种情况
      1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
      2.程序退出时为每个对象调用一次finalize方法。
      3.显式的调用finalize方法

      除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因。

      理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。
分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc.zip

    【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc.zip

    rust-gc:用于Rust的简单跟踪(标记和清除)垃圾收集器

    锈-gc 用于Rust的简单跟踪(标记和清除)垃圾收集器 ... 放置在Gc类型必须实现Trace和Finalize 。 最简单的方法是使用gc_derive板条箱: use gc :: {Finalize, Gc, Trace}; #[derive(Trace, Finali

    简单理解Java的垃圾回收机制与finalize方法的作用

    主要介绍了简单理解Java的垃圾回收机制与finalize方法的作用,着重讲解了Java的GC销毁对象的过程,需要的朋友可以参考下

    finalize.js:JavaScriptnode的垃圾收集器回调

    var finalize = require ( 'finalize' ) ; var obj = { x : 1337 } ; finalize ( obj , function ( ) { console . log ( this . x ) ; // this will print '1337' } ) ; global . gc ( ) ; // nothing will happen,...

    C#多线程开发多个实例

    //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦 if (disposing) { GC.SuppressFinalize(this); } } } static void Main(string[] args) { //tmpObj1...

    中关村在线

    PER_TIME_IN_GC_COUNTER_009_HELP=% Time in GC is the percentage of elapsed time that was spent in performing a garbage collection (GC) since the last GC cycle. This counter is usually an indicator of ...

    Java程序员面试宝典 PDF 参考资料.rar

    Java程序员面试宝典 pdf,内容涉及String、Servlet、int 和 Integer的区别、、String 和StringBuffer的区别、运行时异常与一般异常有何异同、Servlet的生命... Collections的区别、HashMap和Hashtable的区别、final...

    Java面试32问

    第一,谈谈final, finally, finalize的区别。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,static Nested Class 和 ...

    大厂真题之京东-Java实习生

    即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象是否有必要执行 finalize() 方法,对象必须重写 finalize()方法且没有被运行过。2)若有必要执行,会把对象放到一个 队列中,JVM 会开一个线程去回收...

    Java程序员面试题及解答

    第一,谈谈final, finally, finalize的区别。  第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?  第三,Static Nested Class 和 ...

    java面试题

    第一,谈谈final, finally, finalize的区别。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和...

    gc-listener:Java实用程序,用于侦听对象的垃圾回收

    gc-侦听器Java实用程序,用于侦听对象的垃圾回收。 假设我们有以下类,并且我们想跟踪何时对该... } @Override protected void finalize() throws Throwable { indexCounter--; } @Override public String toString() {

    java各大软件公司的面试题的集和

    第一,谈谈final, finally, finalize的区别。 最常被问到。 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested ...

    涵盖了90%以上的面试题

    Minor GC和Full GC 垃圾收集器 集合的继承体系 Collection 和 Collections的区别。 如何通过jdbc访问数据库 JDBC处理事务采用什么方法 Statement和PreparedStatement的区别 getString()方法和getObject()方法有什么...

    java_ms.rar_Math Class_java collection

    第一,谈谈final, finally, finalize的区别。  最常被问到。  第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?  第三,Static Nested Class ...

    JVM内存管理及GC原理调优实战

    在去做这项工作前就必须去了解JVM是怎么去管理内存的,GC是怎么完成的。 二、标记算法 垃圾回收是对已经分配出去的但又不再使用的内存进行回收,以便能够再次分配。JVM主要是对堆空间那些死亡对象所占据的空间进行...

    JVM 知识点整理:GC垃圾收集器及相关算法

    JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...

    java面试笔试题大汇总

    第一,谈谈final, finally, finalize的区别。  最常被问到。   第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?   第三,Static Nested...

    java程序员面试必备的32个要点

    第一,谈谈final, finally, finalize的区别。 第三,Static Nested Class 和 Inner Class的不同第四,&和&&的区别。 五,HashMap和Hashtable的区别。 六,Collection 和 Collections的区别 七,什么时候用assert 八...

    对象的一些操作1

    Object的finalize()方法Java没有c++的析构函数,不能显示的销毁对象(由GC接管),当GC发现一个对象没有引用可达是,进行GC操作(调用Obj

Global site tag (gtag.js) - Google Analytics