您好,登錄后才能下訂單哦!
java中finalize的作用是什么?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前被自動(dòng)調(diào)用的。
finalize()方法是Object類中提供的一個(gè)方法,在GC準(zhǔn)備釋放對(duì)象所占用的內(nèi)存空間之前,它將首先調(diào)用finalize()方法。其在Object中定義如下:
protected void finalize() throws Throwable { }
1 finalize()調(diào)用的時(shí)機(jī)
與C++的析構(gòu)函數(shù)(對(duì)象在清除之前析構(gòu)函數(shù)會(huì)被調(diào)用)不同,在Java中,由于GC的自動(dòng)回收機(jī)制,因而并不能保證finalize方法會(huì)被及時(shí)地執(zhí)行(垃圾對(duì)象的回收時(shí)機(jī)具有不確定性),也不能保證它們會(huì)被執(zhí)行(程序由始至終都未觸發(fā)垃圾回收)。
public class Finalizer { @Override protected void finalize() throws Throwable { System.out.println("Finalizer-->finalize()"); } public static void main(String[] args) { Finalizer f = new Finalizer(); f = null; } } //無(wú)輸出
public class Finalizer { @Override protected void finalize() throws Throwable { System.out.println("Finalizer-->finalize()"); } public static void main(String[] args) { Finalizer f = new Finalizer(); f = null; System.gc();//手動(dòng)請(qǐng)求gc } } //輸出 Finalizer-->finalize()
2 什么時(shí)候應(yīng)該使用它
finalize()方法中一般用于釋放非資源(如打開的文件資源、數(shù)據(jù)庫(kù)連接等),或是調(diào)用非Java方法(native方法)時(shí)分配的內(nèi)存(比如C語(yǔ)言的malloc()系列函數(shù))。
3 為什么應(yīng)該避免使用它
首先,由于finalize()方法的調(diào)用時(shí)機(jī)具有不確定性,從一個(gè)對(duì)象變得不可到達(dá)開始,到finalize()方法被執(zhí)行,所花費(fèi)的時(shí)間這段時(shí)間是任意長(zhǎng)的。我們并不能依賴finalize()方法能及時(shí)的回收占用的資源,可能出現(xiàn)的情況是在我們耗盡資源之前,gc卻仍未觸發(fā),因而通常的做法是提供顯示的close()方法供客戶端手動(dòng)調(diào)用。
另外,重寫finalize()方法意味著延長(zhǎng)了回收對(duì)象時(shí)需要進(jìn)行更多的操作,從而延長(zhǎng)了對(duì)象回收的時(shí)間。
4 讓對(duì)象再活一次
利用finalize()方法最多只會(huì)被調(diào)用一次的特性,我們可以實(shí)現(xiàn)延長(zhǎng)對(duì)象的生命周期。
class User{ public static User user = null; @Override protected 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);//true user = null; System.gc(); Thread.sleep(1000); System.out.println(user != null);//false } }
注意:
垃圾回收過(guò)程中執(zhí)行終結(jié)器的準(zhǔn)確時(shí)間是不確定的。不保證資源在任何特定的時(shí)間都能釋放,除非調(diào)用 Close 方法或 Dispose方法。
即使一個(gè)對(duì)象引用另一個(gè)對(duì)象,也不能保證兩個(gè)對(duì)象的終結(jié)器以任何特定的順序運(yùn)行。即,如果對(duì)象 A 具有對(duì)對(duì)象 B 的引用,并且兩者都有終結(jié)器,則當(dāng)對(duì)象 A 的終結(jié)器啟動(dòng)時(shí),對(duì)象 B 可能已經(jīng)終結(jié)了。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。