Java finalize以及Garbage Collection

來源:互聯網
上載者:User

標籤:

Java的記憶體回收機制:

Java的記憶體回收並不等於C++中的析構。Java中,只有在程式瀕臨儲存空間用完的那一刻,對象佔用的空間才會釋放。所以,在JAVA程式中,我們通常只考慮建立對象,而從不關心對象的清除。這個策略是恰當的,因為記憶體回收本身也有開銷,要是不使用它,那就不用支付這部分開銷了。

什麼情況下我們需要finalize()

有了記憶體回收,我們一般不需要關心對象空間的釋放,但在一些特殊的記憶體地區,需要我們手動清除。

特殊的記憶體地區是指在分配記憶體時,如果一個對象正在處理的是非Java 資源,比如,調用類似C的malloc( )函數,用它分配儲存空間,而且除非調用了free( )函數,否則儲存空間將不會得到釋放,從而造成記憶體泄露。當然,free( )是C和C++中的函數,所以你需要在finalize( )中用本地方法調用它;又比如檔案控制代碼或window 字元字型,這時你要確認在一個對象被撤消以前要保證這些資源被釋放。

由於一旦記憶體回收行程準備好釋放對象佔用的儲存空間,將首先調用其 finalize( )方法,並且在下一次記憶體回收動作發生時,才會真正回收對象佔用的記憶體。所以我們將手動清除的方法寫在finalize()函數中。

protected void finalize( ){// finalization code here}

其中,關鍵字protected是防止在該類之外定義的代碼訪問finalize()標識符。

有三種情況會調用finalize()

1.所有對象被Garbage Collection時自動調用,比如運行System.gc()的時候.

2.程式退出時為每個對象調用一次finalize方法。

3.顯式的調用finalize方法

Java finalize以及Garbage Collection

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.