java中的java.lang.OutOfMemoryError错误

时间:2016-10-16 19:25:01

标签: java memory out-of-memory

我编写了一个java程序,我应该知道,如果两个嵌套的for循环可以在4秒内完成执行,如果它们在4秒内完成执行,那么程序应该继续打破循环。我有三个列表A,B和C,我正在执行一些操作并将其添加到列表B.即使对于列表A和C的小输入,如3,6,8,4,我的程序抛出{{1} }

我正在使用一个外部循环来计算时间。如果两个for循环无法在4秒内完成执行,则循环应该终止。我使用一个计数变量来跟踪for循环执行,即使for循环在4秒之前完成执行我终止了外循环。
这是我的代码

run out of memory error


这段代码有什么问题?我该怎么做才能正确?
谢谢。

3 个答案:

答案 0 :(得分:2)

我认为这种设计不是很强大。我认为你可以考虑在这里使用两个线程,而不是在该循环中调用time函数:

  1. 线程A踢线程B,等待 n
  2. 线程B进行计算
  3. 当线程A醒来时,它只是检查计算是否完成
  4. 或者,你的主要线程踢A和B; A回来告诉你:现在检查B的结果的时间。

    对于你真正的问题;我猜一个撰稿人在这里:

    B.add(Math.abs(i-j));
    

    你看到B(对于列表的数字确实是坏名字btw!)接受Long对象。因此,每次迭代都会产生至少一个Long对象。你迭代A和C.没有任何睡眠或延迟。这意味着您的代码正在执行 nothing else,但迭代循环并创建新对象以填充该B列表。

    现在:您认为您将在4秒内看到多少次循环迭代?足以创造数以百万计的物品?!然后:一个动态增长的列表很不错,但是当ArrayList不断超过其容量并且需要增长时,你理解意味着什么?您了解这意味着创建数组,并复制所有值?!

    我所说的是:仔细查看那里的工作量是多少;你的代码中有多少(un)拳击原始/参考长/长。

    测试这些想法的一种(可能很简单的方法):将代码从使用List of Longs改为使用具有长值的固定数组。这会有一个很好的副作用 - 它会迫使你想到提前你实际想要创建多少个数组插槽。在您的解决方案中,您只需继续循环并添加新对象(如上所述;导致B列表的常量重新容量增加操作)。

答案 1 :(得分:0)

语句while(!(A.isEmpty()))将运行无限循环,导致B无限次地实例化。

导致OutOfMemoryError

答案 2 :(得分:-1)

你有一个无限循环,while(!(A.isEmpty))将永远是真的,因为你的for循环中你永远不会从A中删除任何元素。这将导致你向B添加无限量的元素,因为{{ 1}}