在C++中,使用new配置的物件,必須使用delete來
清除物件,以釋放物件所佔據的記憶體空間,如果沒有進行這個動作,則若物件不斷的產生,記憶體就會不斷的被耗用,最後使得記憶體空間用盡,然而使用
delete並不是那麼的簡單,如果不小心清除了尚被參考的物件,或是物件間共用的資源,則程式就會發生錯誤,小心的使用new與delete,一直是C
++中一個重要的課題。 在Java中,使用new配置的物件,基本上也是必須清除以回收記憶體空間的,但是您並不用特別關心這個問題,因為Java提供「垃圾收集」(Garbage collection)機制,在適當的時候,Java執行環境會自動檢查物件,看看是否有未被參考的物件,如果有的話就清除物件、回收物件所佔據的記憶體空間。 垃圾收集的時機我們並無法得知,可能是記憶體資源不足的時候,或是在程式空閒的時候,您可以建議執行環境進行垃圾收集,但也僅止於建議,如果程式當時有優先權更高的執行緒(Thread)正在進行,則垃圾收集並不一定會馬上進行。 在C++中有解構方法(Destructor),它會在物件被清除前執行,在Java中並不明確有解構方法,因為我們不知道物件什麼時候會被回收,在Java中有finalize()這 個方法,它被宣告為protected,它會在物件被回收時執行,但您不可以將它當作解構方法來使用,因為不知道物件資源何時被回收,所以也就不會立即執 行我們所指定的動作,但您可以使用finalize()來進行一些相關資源的清除動作,而這些動作與立即性的收尾動作並沒有關係。 如果我們確定某個物件不再使用,您可以在參考至該物件的名稱上指定null,表示這個名稱不在參考至任何物件,可以使用System.gc()建議程式進行垃圾收集,如果建議被採納,則物件資源會被回收,回收前會執行finalize()方法。 下面這個程式是個簡單的示範:
public class GcTest {
public class UseGC { 執行結果:
您故意加上無窮迴圈,以讓垃圾收集在程式結束前有機會執行,藉以瞭解垃圾收集確實會運作。 |