2011-03-14 64 views
0

我有一個應用程序,其中java.util.LinkedList $ Entry對象的數目似乎在穩步增加。此應用程序包含一個方法,其中包含以下代碼:

final List<Boolean> correctnessList = new ArrayList<Boolean>(); 
    final List<Double> discriminationList = new ArrayList<Double>(); 
    final List<Double> difficultyList = new ArrayList<Double>(); 
    final List<Double> guessingList = new ArrayList<Double>(); 
       . 
       . 
       . 
    for (ItemData datum : candidateItemData) { 
         . 
         . 
         . 
     correctnessList.add(datum.isCorrect); 
     discriminationList.add(iRTParameter.discrimination); 
     difficultyList.add(iRTParameter.difficulty); 
     guessingList.add(iRTParameter.guessing); 
         . 
         . 
         . 
    } 

包含此代碼的方法稱爲很多次。當然,每次方法返回時,List對象都會超出範圍,並且可能用於垃圾回收。

但是,正如我所說的,java.util.LinkedList $ Entry對象的數量似乎在穩步增加。

我在這裏創建了內存泄漏嗎?我應該在方法末尾的List對象上調用一些方法,以便LinkedList $ Entry對象可以被垃圾回收?

+4

它出現在這段代碼中,你使用'ArrayLists',而不是'LinkedLists'。您可以在此處發佈時發生錯誤嗎? – 2011-03-14 15:41:21

+0

你在這裏使用ArrayLists,而不是LinkedList。 – 2011-03-14 15:43:18

+0

有一個機會,你看着錯誤的代碼塊。應該有'LinkedList'填充'ArrayList'的數量'LinkedLiset $ Entry's的數量不斷增加。你爲什麼認爲這個代碼塊是問題之一? – Simeon 2011-03-14 15:44:15

回答

4

不,您不需要爲要聲明的對象做任何顯式的去初始化。

你最好打賭是找出爲什麼元素不是垃圾收集。爲此,請使用您的首選內存分析器,拍攝快照並嘗試追蹤其中一些元素路徑到最近的GC路由(我個人建議使用VisualVM,因爲它使用起來相對簡單,而且對於很多事情仍然足夠強大)。

另外:在您的示例中,您使用ArrayList作爲您的List實現。那個實現確實是不是使用Entry對象。所以你需要檢查你的代碼在哪裏使用LinkedList

0

你檢查垃圾收集器是否真的跑了嗎?在正常情況下,JVM會定期或者在內存不足的情況下運行gc。作爲約阿希姆紹爾說,可能會有一些從活動線索到你的名單懸而未決的參考。因此,如果gc運行但沒有收集至少一些這些對象(它有時可能不會收集所有符合gc的對象,所以這通常不是問題),您應該檢查引用的位置。

我們曾經有一個關閉數據庫連接條目但未發佈的問題,因此在某些地圖中保存了大量數據。在這種情況下,擺脫對這些連接的引用是有幫助的,但是當我們使用內存跟蹤工具(在我們的例子中是JProbe)時,這一點很明顯。

+0

我在每次獲取內存快照前運行垃圾回收器。 – 2011-03-14 15:59:40

+0

你的垃圾收集器和內存的配置如何?請注意,只有在空間被填滿時,才能收集舊的gen空間中的對象。如果你有一個小的eden空間,或者這些調用正在處理大量數據,這些列表可能會以相當快的速度在舊有空間中結束。 – Thomas 2011-03-14 16:11:21

0

看起來這裏沒有內存泄漏。這取決於你如何使用這個結果。一般來說,垃圾收集器將收集所有的垃圾收集器。 從另一方面來說,它將會更好地用於memoty的使用,當它只有一個列表並且數據將被包裝到包含這些字段的結構中時更是如此。當它將添加第17個項目時 - 新的blok將被分配到內存中,並且之前的項目將被移動到新的內存塊中。所以最好只做一次,而不是四次。 最後的通知是,最好使用可以提供項目數的構造函數。它會分配適當的內存塊。它將避免您填寫收藏時可能的重新分配。