java中的finalize方法是Object類別中提供的一個方法,在GC準備釋放物件所佔用的記憶體空間之前,它將首先呼叫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()系列函數)。首先,由於finalize()方法的呼叫時機具有不確定性,從一個物件變得不可到達開始,到finalize()方法被執行,所花費的時間這段時間是任意長的。我們並不能依賴finalize()方法能及時的回收佔用的資源,可能出現的情況是在我們耗盡資源之前,gc卻仍未觸發,因而通常的做法是提供顯示的close()方法供客戶端手動調用。
另外,重寫finalize()方法意味著延長了回收物件時需要進行更多的操作,從而延長了物件回收的時間。利用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中文網其他相關文章!