posts - 82, comments - 269, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          finalize函數(shù)的一點(diǎn)疑問(wèn)

          Posted on 2006-11-23 15:21 itspy 閱讀(1277) 評(píng)論(6)  編輯  收藏 所屬分類: JAVA技術(shù)

          最近經(jīng)常找工作面試,在復(fù)習(xí)一些基礎(chǔ)知識(shí)時(shí),讓我想起了一個(gè)平時(shí)沒(méi)有留言到的問(wèn)題,就是finalize與GC的關(guān)系。在查一些資料后還是不太明白,特別是下面一段話。

          根據(jù)Java語(yǔ)言規(guī)范,JVM保證調(diào)用finalize函數(shù)之前,這個(gè)對(duì)象是不可達(dá)的,但是JVM不保證這個(gè)函數(shù)一定會(huì)被調(diào)用。另外,規(guī)范還保證finalize函數(shù)最多運(yùn)行一次。
          (上面的這句話來(lái)源:http://www-128.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/index.html


          這句話是不是可以理解:“finalize函數(shù)可能不會(huì)被運(yùn)行,并且就算運(yùn)行也只會(huì)被運(yùn)行一次?”


          那么很自然的就要問(wèn),它在哪些情況會(huì)被調(diào)用,在哪些情況下不會(huì)被調(diào)用。

          如果不被調(diào)用,那么如何釋放一些特定的資源呢?


          我以前一直理解的是,它一定會(huì)在對(duì)象被回收之前被調(diào)用,也就是GC會(huì)保證它運(yùn)行一次,也就是肯定會(huì)運(yùn)行一次。


          評(píng)論

          # re: finalize函數(shù)的一點(diǎn)疑問(wèn)  回復(fù)  更多評(píng)論   

          2006-11-23 16:40 by BeanSoft
          正確,呵呵,有可能不運(yùn)行就被回收了..

          # re: finalize函數(shù)的一點(diǎn)疑問(wèn)  回復(fù)  更多評(píng)論   

          2006-11-23 16:46 by reital
          是這樣的,如果jvm覺(jué)得對(duì)內(nèi)存不足,會(huì)進(jìn)行回收,會(huì)收到一個(gè)對(duì)象的時(shí)候就會(huì)調(diào)用這個(gè)對(duì)象的finilize函數(shù),但是還存在一種情況,就是jvm沒(méi)有覺(jué)得堆內(nèi)存不足你的程序就已經(jīng)結(jié)束了,所以也不會(huì)對(duì)對(duì)象進(jìn)行回收,當(dāng)然也調(diào)用不了這個(gè)函數(shù)。

          # re: finalize函數(shù)的一點(diǎn)疑問(wèn)  回復(fù)  更多評(píng)論   

          2006-11-24 07:58 by swiftybin
          垃圾回收是由JVM控制的,所以如果一個(gè)對(duì)象沒(méi)有任何引用的話就成了垃圾,那么finalize方法有被調(diào)用的可能,可是如果直到程序運(yùn)行結(jié)束推出了,JVM也沒(méi)有進(jìn)行垃圾回收,那finalize方法肯定不會(huì)被調(diào)用。
          所以finalize要么不被調(diào)用,要么只被調(diào)用一次,因?yàn)檎{(diào)用后這個(gè)對(duì)象就沒(méi)啦,那它的finalize方法還怎么調(diào)用。

          # re: finalize函數(shù)的一點(diǎn)疑問(wèn)  回復(fù)  更多評(píng)論   

          2006-11-24 09:37 by itspy
          我又找到了下面的參考文獻(xiàn),這人講的比較清楚

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


          首先,只有當(dāng)垃圾回收器釋放該對(duì)象的內(nèi)存時(shí),才會(huì)執(zhí)行finalize()。如果在 Applet 或應(yīng)用程序退出之前垃圾回收器沒(méi)有釋放內(nèi)存,垃圾回收器將不會(huì)調(diào)用finalize()。

          樓上的說(shuō):
          “因所以finalize要么不被調(diào)用,要么只被調(diào)用一次,因?yàn)檎{(diào)用后這個(gè)對(duì)象就沒(méi)啦,那它的finalize方法還怎么調(diào)用。 ”
          這一點(diǎn)好像不太對(duì),因?yàn)橄旅娴膮⒖嘉墨I(xiàn)就給了一個(gè)反例:就是在finalize函數(shù)中,可以把對(duì)象重新變成可達(dá)的,這樣對(duì)象就不會(huì)被GC回收了。
          http://www-128.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/index.html

          # re: finalize函數(shù)的一點(diǎn)疑問(wèn)  回復(fù)  更多評(píng)論   

          2006-11-27 22:37 by reital
          呵呵,更正一下:所以finalize要么不被調(diào)用,要么只被調(diào)用一次,因?yàn)檎{(diào)用后這個(gè)對(duì)象就沒(méi)啦,那它的finalize方法還怎么調(diào)用。
          應(yīng)該是:應(yīng)為推出后對(duì)象就沒(méi)有了。 筆誤,謝謝樓上給與指出。

          # re: finalize函數(shù)的一點(diǎn)疑問(wèn)  回復(fù)  更多評(píng)論   

          2006-11-28 10:41 by itspy
          我還以為我們對(duì)這個(gè)東西的理解不一樣呢。原來(lái)是筆誤啊,剛好出現(xiàn)在關(guān)鍵位置了,引起了誤會(huì)。

          主站蜘蛛池模板: 彭阳县| 岚皋县| 新乐市| 绥芬河市| 交城县| 龙门县| 丰镇市| 东光县| 青冈县| 瑞安市| 嵊州市| 集贤县| 历史| 达日县| 洪雅县| 正阳县| 平湖市| 新竹县| 双桥区| 海安县| 灵石县| 于田县| 金阳县| 宁海县| 个旧市| 大宁县| 定安县| 手机| 遂平县| 两当县| 河曲县| 湖北省| 黔西| 江都市| 孝昌县| 浦北县| 美姑县| 得荣县| 桃江县| 田阳县| 莱芜市|