1. 程式人生 > >清理:處理終結和垃圾回收

清理:處理終結和垃圾回收

首先,Java也有垃圾收集器,且回收不在使用的物件佔據的記憶體,但有一種特殊的情況-------沒有使用new,但垃圾收集器只知道釋放由new分配的記憶體,此時就需要用到finalize()方法。

在理想情況下,它的工作原理應該是這樣的:一旦垃圾收集器準備好釋放物件佔用的儲存空間,它首先呼叫finalize(),而且只有在下一次垃圾收集過程中,才會真正回收物件的記憶體。

所以如果使用finalize(),就可以在垃圾收集期間進行一些重要的清除或清掃工作。

 

在Java程式設計中,Java物件併發總是被垃圾回收:

1 .我們的物件可能不會被來當作垃圾收走

有時可能發現一個物件的儲存空間永遠都不會釋放,因為自己的程式永遠都接近於用光空間的臨界點。若程式執行結束,而且垃圾收集器一直都沒有釋放我們建立的任何物件的儲存空間,則隨著程式的退出,那些資源會返回給作業系統。這是一件好事情,因為垃圾收集本身也要消耗一些開銷。如永遠都不用它,那麼永遠也不用支出這部分開銷。

2.垃圾回收並不等於"析構"

首先Java並沒有提供"析構"函式,如果要做類似的清理需要自己手動建立一個執行清理的工作方法。

3.垃圾回收之和記憶體有關

作者強調一般不該將finalize()方法作為通用的清理方法,其原因就是以上紅字2點。

 

實施清理

Java不允許我們建立本地(區域性)物件——無論如何都要使用new。但在Java中,沒有“delete”命令來釋放物件,因為垃圾收集器會幫助我們自動釋放儲存空間,因此Java不存在解構函式。隨著以後學習的深入,就會知道垃圾收集器的存在並不能完全消除對破壞器的需要,或者說不能消除對破壞器代表的那種機制的需要(而且絕對不能直接呼叫finalize(),所以應儘量避免用它)。

  無論是"垃圾回收" 還是中介,都不能保證一定發生。如果Java虛擬機器為面臨記憶體耗盡的情況下,它是不會浪費時間去執行垃圾回收來回復記憶體的。