中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中finalize的作用是什么

發布時間:2020-07-03 15:49:36 來源:億速云 閱讀:1001 作者:元一 欄目:編程語言

java中finalize的作用是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前被自動調用的。

finalize()方法是Object類中提供的一個方法,在GC準備釋放對象所占用的內存空間之前,它將首先調用finalize()方法。其在Object中定義如下:

protected void finalize() throws Throwable { }

1 finalize()調用的時機

與C++的析構函數(對象在清除之前析構函數會被調用)不同,在Java中,由于GC的自動回收機制,因而并不能保證finalize方法會被及時地執行(垃圾對象的回收時機具有不確定性),也不能保證它們會被執行(程序由始至終都未觸發垃圾回收)。

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 什么時候應該使用它

finalize()方法中一般用于釋放非資源(如打開的文件資源、數據庫連接等),或是調用非Java方法(native方法)時分配的內存(比如C語言的malloc()系列函數)。

3 為什么應該避免使用它

首先,由于finalize()方法的調用時機具有不確定性,從一個對象變得不可到達開始,到finalize()方法被執行,所花費的時間這段時間是任意長的。我們并不能依賴finalize()方法能及時的回收占用的資源,可能出現的情況是在我們耗盡資源之前,gc卻仍未觸發,因而通常的做法是提供顯示的close()方法供客戶端手動調用。
另外,重寫finalize()方法意味著延長了回收對象時需要進行更多的操作,從而延長了對象回收的時間。

4 讓對象再活一次

利用finalize()方法最多只會被調用一次的特性,我們可以實現延長對象的生命周期。

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
	}
}

注意:

垃圾回收過程中執行終結器的準確時間是不確定的。不保證資源在任何特定的時間都能釋放,除非調用 Close 方法或 Dispose方法。

即使一個對象引用另一個對象,也不能保證兩個對象的終結器以任何特定的順序運行。即,如果對象 A 具有對對象 B 的引用,并且兩者都有終結器,則當對象 A 的終結器啟動時,對象 B 可能已經終結了。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

搜索| 武夷山市| 旬阳县| 奉化市| 清徐县| 乐山市| 泰来县| 敦煌市| 扎兰屯市| 偃师市| 乳源| 唐河县| 沾益县| 肥乡县| 奉贤区| 怀远县| 黑山县| 广昌县| 沙河市| 乐安县| 涡阳县| 康平县| 青河县| 勐海县| 金沙县| 库伦旗| 荔波县| 都安| 鄢陵县| 金堂县| 呼和浩特市| 花垣县| 枣庄市| 康平县| 浦北县| 闻喜县| 民和| 余江县| 潢川县| 类乌齐县| 建阳市|