posts - 82, comments - 269, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

finalize函数的一点疑问

Posted on 2006-11-23 15:21 itspy 阅读(1152) 评论(6)  编辑  收藏 所属分类: JAVA技术

最近经常找工作面试,在复习一些基础知识时,让我想起了一个平时没有留言到的问题,就是finalize与GC的关系。在查一些资料后还是不太明白,特别是下面一段话。

根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。
(上面的这句话来源:http://www-128.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/index.html


这句话是不是可以理解:“finalize函数可能不会被运行,并且就算运行也只会被运行一次?”


那么很自然的就要问,它在哪些情况会被调用,在哪些情况下不会被调用。

如果不被调用,那么如何释放一些特定的资源呢?


我以前一直理解的是,它一定会在对象被回收之前被调用,也就是GC会保证它运行一次,也就是肯定会运行一次。


评论

# re: finalize函数的一点疑问  回复  更多评论   

2006-11-23 16:40 by BeanSoft
正确,呵呵,有可能不运行就被回收了..

# re: finalize函数的一点疑问  回复  更多评论   

2006-11-23 16:46 by reital
是这样的,如果jvm觉得对内存不足,会进行回收,会收到一个对象的时候就会调用这个对象的finilize函数,但是还存在一种情况,就是jvm没有觉得堆内存不足你的程序就已经结束了,所以也不会对对象进行回收,当然也调用不了这个函数。

# re: finalize函数的一点疑问  回复  更多评论   

2006-11-24 07:58 by swiftybin
垃圾回收是由JVM控制的,所以如果一个对象没有任何引用的话就成了垃圾,那么finalize方法有被调用的可能,可是如果直到程序运行结束推出了,JVM也没有进行垃圾回收,那finalize方法肯定不会被调用。
所以finalize要么不被调用,要么只被调用一次,因为调用后这个对象就没啦,那它的finalize方法还怎么调用。

# re: finalize函数的一点疑问  回复  更多评论   

2006-11-24 09:37 by itspy
我又找到了下面的参考文献,这人讲的比较清楚

http://www.microsoft.com/china/MSDN/library/archives/technic/develop/vj/0515c.asp


首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize()。如果在 Applet 或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()。

楼上的说:
“因所以finalize要么不被调用,要么只被调用一次,因为调用后这个对象就没啦,那它的finalize方法还怎么调用。 ”
这一点好像不太对,因为下面的参考文献就给了一个反例:就是在finalize函数中,可以把对象重新变成可达的,这样对象就不会被GC回收了。
http://www-128.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/index.html

# re: finalize函数的一点疑问  回复  更多评论   

2006-11-27 22:37 by reital
呵呵,更正一下:所以finalize要么不被调用,要么只被调用一次,因为调用后这个对象就没啦,那它的finalize方法还怎么调用。
应该是:应为推出后对象就没有了。 笔误,谢谢楼上给与指出。

# re: finalize函数的一点疑问  回复  更多评论   

2006-11-28 10:41 by itspy
我还以为我们对这个东西的理解不一样呢。原来是笔误啊,刚好出现在关键位置了,引起了误会。


只有注册用户登录后才能发表评论。


网站导航: