Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前被自動調用的。
finalize()方法是Object類中提供的一個方法,在GC準備釋放對象所占用的內存空間之前,它將首先調用finalize()方法。其在Object中定義如下:
protected void finalize() throws Throwable { }
1 finalize()調用的時機
與C++的析構函數(對象在清除之前析構函數會被調用)不同,在Java中,由于GC的自動回收機制,因而并不能保證finalize方法會被及時地執行(垃圾對象的回收時機具有不確定性),也不能保證它們會被執行(程序由始至終都未觸發垃圾回收)。
public class Finalizer {@Overrideprotected void finalize() throws Throwable {System.out.println("Finalizer-->finalize()");}public static void main(String[] args) {Finalizer f = new Finalizer();f = null;}}//無輸出
public class Finalizer {@Overrideprotected void finalize() throws Throwable {System.out.println("Finalizer-->finalize()");}public static void main(String[] args) {Finalizer f = new Finalizer();f = null;System.gc();//手動請求gc}}//輸出 Finalizer-->finalize()
2 什么時候應該使用它
finalize()方法中一般用于釋放非資源(如打開的文件資源、數據庫連接等),或是調用非Java方法(native方法)時分配的內存(比如C語言的malloc()系列函數)。
3 為什么應該避免使用它
首先,由于finalize()方法的調用時機具有不確定性,從一個對象變得不可到達開始,到finalize()方法被執行,所花費的時間這段時間是任意長的。我們并不能依賴finalize()方法能及時的回收占用的資源,可能出現的情況是在我們耗盡資源之前,gc卻仍未觸發,因而通常的做法是提供顯示的close()方法供客戶端手動調用。
另外,重寫finalize()方法意味著延長了回收對象時需要進行更多的操作,從而延長了對象回收的時間。
4 讓對象再活一次
利用finalize()方法最多只會被調用一次的特性,我們可以實現延長對象的生命周期。
class User{public static User user = null;@Overrideprotected void finalize() throws Throwable {System.out.println("User-->finalize()");user = this;}}public class FinalizerTest {public static void main(String[] args) throws InterruptedException {User user = new User();user = null;System.gc();Thread.sleep(1000);user = User.user;System.out.println(user != null);//trueuser = null;System.gc();Thread.sleep(1000);System.out.println(user != null);//false}}
注意:
垃圾回收過程中執行終結器的準確時間是不確定的。不保證資源在任何特定的時間都能釋放,除非調用Close方法或Dispose方法。
即使一個對象引用另一個對象,也不能保證兩個對象的終結器以任何特定的順序運行。即,如果對象 A 具有對對象 B 的引用,并且兩者都有終結器,則當對象 A 的終結器啟動時,對象 B 可能已經終結了。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注本站行業資訊頻道,感謝您對本站的支持。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
余額寶保本嗎?余額寶對接的是貨幣型基金,原則上是不保本的,但從余額寶歷年的數據來看,收益穩定且風險極小,沒有虧損的情況。貨幣型基金投資的標的一般都是無風險的貨幣市場工具,需要安全性高期限短,比如:現金、大額存單、一年以內(含一年)的銀行定期存款等資產,不得投資于風險較高,期限較長的資產,比如:股票、可轉換債券、信用等級在AAA級以下的企業債券和收流通限制的證券等資產。長期存在余額寶的錢有風險嗎?有...
【資料圖】最近這段時間總有小伙伴問小編VR黑玻璃材質參數怎么調是什么,小編為此在網上搜尋了一些有關于VR黑玻璃材質參數怎么調的知識送給大家,希望能解答各位小伙伴的疑惑。1、漫反射給黑色反射給一些,折射給到一半左右;2、漫反射給偏黑色,反射給一些,折射給全透明;3、折射煙霧顏色里面調成灰色,值不要太大,需要測試;4、表面漫射色給成烤漆玻璃顏色,反射給200到220左右,不要太高,勾選Fresnel,...
配債是什么意思要購買嗎?配債是指股票配債,是上市公司發行的一種債券,是上市公司的一種融資行為。就是上市公司發行配債,投資者可以購買,然后上市公司達到融資的目的,這是股市里面很常見的一種操作,畢竟一個公司是需要不斷地融資的。配債是需要購買的,如果某公司要發行債券,你持有這家公司的股票,你就優先獲得購買權。在配債申購日那天,投資者只需要賬戶里有現金,輸入委托代碼,就可以得到這個轉債,股票賬戶里的現金就...