簡體   English   中英

釋放java.util.LinkedList $ Entry內存

[英]Releasing java.util.LinkedList$Entry memory

我有一個應用程序,其中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對象嗎?

不,您不需要為聲明的對象做任何顯式的取消初始化。

最好的選擇是找出為什么不對元素進行垃圾收集。 為此,請使用您偏愛的內存分析器,進行快照並嘗試跟蹤其中一些元素到最近的GC路由(我個人建議使用VisualVM,因為它相對簡單易用,並且對於許多事情仍然足夠強大)。

另外:在示例中,您將ArrayList用作List實現。 這實現使用Entry對象。 因此,您需要檢查代碼中使用LinkedList

您檢查垃圾收集器是否真正運行了嗎? 在正常情況下,JVM決定定期或在內存不足時運行gc。

正如Joachim Sauer所說,從活動線程到列表的引用可能有些懸而未決。 因此,如果gc運行了,但沒有收集到至少一些對象(它有時可能沒有收集到所有符合gc的對象,因此通常不是問題),則應檢查引用的位置。

我們曾經遇到了一個數據庫連接條目的問題,這些條目已關閉但未釋放,因此在某些地圖中保存了大量數據。 在這種情況下,擺脫對這些連接的引用會有所幫助,但是只有當我們采用內存跟蹤工具(在我們的案例中為JProbe)時,這才很明顯。

看起來這里沒有內存泄漏。 這取決於您如何使用此結果。 通常,垃圾收集器將收集所有這些垃圾。 另一方面,當僅使用一個列表並且數據將被包裝到包含這些字段的結構中時,對於備忘錄的使用和哈希處理會更好。 當它將添加第17個項目時-新的塊將分配到內存中,而以前的項目將被移到新的內存塊中。 因此最好只設置一次而不是4次。 最后要注意的是,最好使用構造函數來提供項目計數。 它將分配適當的內存塊。 它將在您填充集合時避免可能的重新分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM