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

          finalize函數的一點疑問

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

          主站蜘蛛池模板: 广昌县| 樟树市| 嘉祥县| 镇坪县| 纳雍县| 江都市| 阜城县| 麻栗坡县| 秦皇岛市| 襄城县| 独山县| 晋城| 武乡县| 图们市| 万源市| 宝兴县| 怀集县| 无极县| 金秀| 高雄市| 财经| 蚌埠市| 大同市| 潞西市| 广东省| 嵊州市| 容城县| 海南省| 衡阳市| 丰台区| 南木林县| 平湖市| 平凉市| 慈溪市| 陆丰市| 车险| 贵溪市| 潢川县| 南江县| 小金县| 大关县|