posts - 70,comments - 408,trackbacks - 0

          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(),就可以在垃圾收集期間進行一些重要的清除或清掃工作.

          finalize使用的三種情況:
          1.所有對象被Garbage Collection時自動調用,比如運行System.gc()的時候.
          2.程序退出時為每個對象調用一次finalize方法。
          3.顯式的調用finalize方法
          除此以外,正常情況下,當某個對象被系統收集為無用信息的時候,finalize()將被自動調用,但是jvm不保證finalize()一定被調用,也就是說,finalize()的調用是不確定的,這也就是為什么sun不提倡使用finalize()的原因.

          posted on 2005-11-10 18:25 我心依舊 閱讀(365) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 额济纳旗| 广河县| 根河市| 嘉禾县| 宾阳县| 富裕县| 沾化县| 琼结县| 吉木乃县| 高青县| 平和县| 海口市| 留坝县| 德令哈市| 克东县| 马公市| 托里县| 新和县| 太谷县| 永靖县| 益阳市| 九江县| 杭锦后旗| 保德县| 六枝特区| 镇江市| 盐池县| 上犹县| 宕昌县| 冷水江市| 乌鲁木齐市| 娱乐| 大渡口区| 读书| 姜堰市| 长垣县| 兴文县| 临沧市| 华宁县| 察雅县| 鲁甸县|