2015-09-19 69 views
0

我想知道什麼時候在Java中釋放一個對象?如何知道何時在Java中釋放對象?

如果在Swift中有類似deinit的東西,我可以在那裏釋放一些資源。 前)

deinit { 
    myResource1.dispose() 
    myResource2.release() 
    someOtherResource.close() 
    .... 
} 

是它在Java中的壞習慣,所以我必須找到另一種方式?

具體來說,我想知道列表視圖中的某行何時死亡。

+0

「我想知道列表視圖中的某行何時死亡。」 - 您可以在帖子中發佈相關代碼嗎? Java會自動回收內存,但不會自動執行其他資源。 'finalize()'方法可以幫助確保資源最終被釋放,但*不及時*。你可能想看一下[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html),它確保每個資源在聲明。 –

回答

1

與構造函數不同,在Java中沒有析構函數或de-init。當實例不可訪問時(不再提及對象),它將自動收集垃圾垃圾。

您可以嘗試在您的課程中實施finalize()方法。

當垃圾回收確定沒有更多對該對象的引用時,由對象上的垃圾回收器調用。

+1

你不應該使用finalize()。您無法保證GC何時或如何調用此方法。至少你可以確定它不會在對象的內存被GC回收之前調用它,這通常在參考不可見之後很多。 Java只是沒有這種類型的功能,這就是爲什麼有必要釋放資源的close()方法。 –

+0

@MatthiasWimmer所以我們必須編寫我們自己的方法並在必要時調用方法。對 –

1

Employee類:

class Employee { 
    public int id; 

    public Employee(int id) { 
     // TODO Auto-generated constructor stub 
     this.id = id; 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     // TODO Auto-generated method stub 
     super.finalize(); 
     System.out.println(this.id + " Garbage Collected"); 
    } 
} 

MainClass:

public class TestMain { 
public static void main(final String[] args) throws ParseException { 
    Employee p = new Employee(111); 
    Employee p2 = new Employee(222); 
    p = null; 
    p2 = null; 
    System.gc(); 
} 

} 

注意:雖然它不知道是否垃圾收集器將被稱爲與否即使我們調用GC()方法

相關問題