溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java中finalize的作用是什么

發(fā)布時(shí)間:2020-07-03 15:49:36 來(lái)源:億速云 閱讀:1001 作者:元一 欄目:編程語(yǔ)言

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ì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI