搜尋
首頁JavaJava基礎java中的finalize方法有什麼作用

java中的finalize方法有什麼作用

Jul 03, 2020 pm 03:34 PM
java

java中的finalize方法是Object類別中提供的一個方法,在GC準備釋放物件所佔用的記憶體空間之前,它將首先呼叫finalize()方法。

java中的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
	}
}

推薦教學: 《

java教學

以上是java中的finalize方法有什麼作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具