2011-10-04 83 views
6

我必須假設下面的方法不會泄露內存:的Java分配內存泄漏

public final void setData(final Integer p_iData) 
{ 
    data = p_iData; 
} 

哪裏data是一些類的屬性。

每次調用該方法時,new Integer都將替換當前存在的data引用。 那麼當前/舊數據發生了什麼?

Java必須在引擎蓋下做些事情;否則我們不得不在每次分配對象時都清空任何對象。

+0

是的,它被稱爲[BigBadGarbageCollector](http://en.wikipedia.org/wiki/Garbage_collection_(computer_science))。 –

+0

Java支持自動GC。看看這裏的示例代碼示例:http://www.herongyang.com/Computer-History/Java-Support-Automatic-Garbage-Collection.html –

回答

7

最簡單的說明:

定期垃圾收集着眼於系統中的所有對象,並認爲這是無法到​​達任何更多的從活引用。它釋放任何不再可到達的對象。

請注意,您的方法確實而不是創建一個新的Integer對象。例如,對同一對象Integer的引用可以一次又一次地傳遞。

垃圾收集的現實是很多比這更復雜:

  • 現代選區往往是,假設大多數對象是短暫的,所以它並不需要檢查整個(可能很大)堆如常;它可以頻繁地檢查「近期」對象的活躍度
  • 對象可以有終結器 - 代碼在垃圾收集之前運行。這由週期延遲此類對象的垃圾收集,並通過使自身可達
  • 現代選區可以並行收集對象甚至可以「復活」本身,有衆多的調節選項
0

它最終得到垃圾回收。

3

Java是垃圾收集語言。

一旦沒有更多的對象的實時引用,它就有資格進行垃圾回收。收集器會不時運行並收回對象的內存。

簡而言之,您的代碼100%正確,並且不會泄漏內存。

+1

+1 - 簡單,充分的答案。 –

0

如果沒有療法參照data,JAVA的垃圾收集器將清潔舊數據並釋放內存

0

實際上,由於整數是一個對象不是原始類型,線:

data = p_iData; 

正在更新參考。

現在,this.data用於指向的舊對象將由GC檢查以確定是否不再有對該對象的引用。如果不是,則該對象被銷燬並且內存被釋放(在稍後的時間)

0

如果先前由數據引用的對象不再由任何正在運行的線程引用的任何對象結構引用,則它有資格使用垃圾收集。 GC由後臺的Java執行,以釋放未使用對象的內存。

0

我想表明在一些代碼一個例子,你 :

int x; 
x=10; 
x=20; 

最初我分配x到10 一下x 20 第一參考內存會被Java GC處理。 Java GC是一個連續運行的線程,並檢查未引用的內存並清理它。

+1

不是因爲'int'是一個原始類型,而且即使您採用了'Integer x;'而是留下以下行來使用自動裝箱來整數,因爲'Integer.valueOf(int i)'使用緩存的'Integer '-128到127之間的所有值都是從不GCC的實例。至少在標準的Java實現中。 – Gandalf