2011-03-14 53 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将被分配到内存中,并且之前的项目将被移动到新的内存块中。所以最好只做一次,而不是四次。 最后的通知是,最好使用可以提供项目数的构造函数。它会分配适当的内存块。它将避免您填写收藏时可能的重新分配。