posts - 82, comments - 269, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          finalize函數的一點疑問

          Posted on 2006-11-23 15:21 itspy 閱讀(1265) 評論(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
          我還以為我們對這個東西的理解不一樣呢。原來是筆誤啊,剛好出現在關鍵位置了,引起了誤會。

          主站蜘蛛池模板: 龙泉市| 都昌县| 麻江县| 沅江市| 工布江达县| 清丰县| 五峰| 高台县| 永修县| 逊克县| 沂源县| 鄂托克前旗| 饶阳县| 敖汉旗| 赤水市| 通化县| 剑阁县| 泰兴市| 玛纳斯县| 广水市| 家居| 海门市| 澄城县| 双城市| 泌阳县| 措勤县| 嘉定区| 宁津县| 双牌县| 怀来县| 涞源县| 永年县| 无锡市| 鸡东县| 卢龙县| 凭祥市| 乐昌市| 肇源县| 顺义区| 晋宁县| 许昌市|