java.util.LinkedList导致无限循环/ OutOfMemoryError

时间:2009-11-18 04:43:56

标签: java

3 个答案:

答案 0 :(得分:2)

LinkedList :: clone()没有错。如果它挂起,那么你的列表已经损坏,不知何故形成了一个循环链接。以下是来自java/util/LinkedList.java的唯一相关代码的摘要:

for (Entry e = header.next; e != header; e = e.next)
    clone.add(e.element);

这与LinkedList :: toArray()使用的算法相同,因此如果clone()挂起,那么应该这样:

System.out.println(Arrays.toString(myList.toArray()));

如果挂起,则表明您的列表已损坏。最可能的罪魁祸首是同步问题。 LinkedList不是线程安全的。尝试同步您的声明:

List<myType> myList = Collections.synchronizedList(new LinkedList<myType>());

答案 1 :(得分:0)

您是否检查了JVM的内存分配选项?具体为-Xms-Xmx。你可能刚刚填满了默认分配的所有内存。你能试试

吗?
-Xms256m -Xmx1024m

并查看它是否在同一个地方失败了?

答案 2 :(得分:0)

好的,所以我明白了。我曾经以为我在做一些导致LinkedList无限循环的事情,但实际发生的是我写了一个无限循环,其中包括对LinkedList方法的调用,而且只是当我暂停线程或系统用尽时内存,它是在执行LinkedList方法期间 显然,这些必须花费更长的时间来执行循环内的其余代码或其他东西。因为当我查看堆栈跟踪时它总是在LinkedList中,我认为我在某种程度上打破了LinkedList,实际上我的破解代码只是反复调用LinkedList方法,直到我停止它或内存不足。