java中finalize的作用是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括鞏留網(wǎng)站建設(shè)、鞏留網(wǎng)站制作、鞏留網(wǎng)頁制作以及鞏留網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鞏留網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鞏留省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時(shí)對這個對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前被自動調(diào)用的。
finalize()方法是Object類中提供的一個方法,在GC準(zhǔn)備釋放對象所占用的內(nèi)存空間之前,它將首先調(diào)用finalize()方法。其在Object中定義如下:
protected void finalize() throws Throwable { }
1 finalize()調(diào)用的時(shí)機(jī)
與C++的析構(gòu)函數(shù)(對象在清除之前析構(gòu)函數(shù)會被調(diào)用)不同,在Java中,由于GC的自動回收機(jī)制,因而并不能保證finalize方法會被及時(shí)地執(zhí)行(垃圾對象的回收時(shí)機(jī)具有不確定性),也不能保證它們會被執(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; } } //無輸出
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();//手動請求gc } } //輸出 Finalizer-->finalize()
2 什么時(shí)候應(yīng)該使用它
finalize()方法中一般用于釋放非資源(如打開的文件資源、數(shù)據(jù)庫連接等),或是調(diào)用非Java方法(native方法)時(shí)分配的內(nèi)存(比如C語言的malloc()系列函數(shù))。
3 為什么應(yīng)該避免使用它
首先,由于finalize()方法的調(diào)用時(shí)機(jī)具有不確定性,從一個對象變得不可到達(dá)開始,到finalize()方法被執(zhí)行,所花費(fèi)的時(shí)間這段時(shí)間是任意長的。我們并不能依賴finalize()方法能及時(shí)的回收占用的資源,可能出現(xiàn)的情況是在我們耗盡資源之前,gc卻仍未觸發(fā),因而通常的做法是提供顯示的close()方法供客戶端手動調(diào)用。
另外,重寫finalize()方法意味著延長了回收對象時(shí)需要進(jìn)行更多的操作,從而延長了對象回收的時(shí)間。
4 讓對象再活一次
利用finalize()方法最多只會被調(diào)用一次的特性,我們可以實(shí)現(xiàn)延長對象的生命周期。
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 } }
注意:
垃圾回收過程中執(zhí)行終結(jié)器的準(zhǔn)確時(shí)間是不確定的。不保證資源在任何特定的時(shí)間都能釋放,除非調(diào)用 Close 方法或 Dispose方法。
即使一個對象引用另一個對象,也不能保證兩個對象的終結(jié)器以任何特定的順序運(yùn)行。即,如果對象 A 具有對對象 B 的引用,并且兩者都有終結(jié)器,則當(dāng)對象 A 的終結(jié)器啟動時(shí),對象 B 可能已經(jīng)終結(jié)了。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。