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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 汶川县| 龙里县| 清镇市| 翼城县| 东海县| 本溪| 湘阴县| 藁城市| 安阳市| 上思县| 白沙| 莎车县| 和龙市| 台安县| 桦南县| 临颍县| 惠东县| 东宁县| 中西区| 宁安市| 禄劝| 龙门县| 霍林郭勒市| 武城县| 穆棱市| 永平县| 临沭县| 沁源县| 宜宾县| 玉山县| 温宿县| 漳浦县| 松潘县| 定襄县| 民县| 宜宾市| 华宁县| 福海县| 于田县| 岢岚县| 沽源县|