多线程应用程序在3天后停止

时间:2011-07-05 07:49:35

标签: java multithreading memory-management thread-safety

我有一个多线程应用程序,可以获取不同的网页。为此,我设计了线程之间的父子关系。 父母只需从其页面中获取不同的URL并生成新线程。这些线程不断获取页面,直到页面更改为止。主线程每两分钟轮询主页上的更改(如果有任何更改,则创建新线程)

主线程算法

while(true){
    find_new_instances(...);
    if we get any new, then
        Thread.start(...);
    Thread.sleep(120000);
}

主线程有一个String arraylist,它存储它创建的每个新线程的url。我听说线​​程应该只使用不可变对象进行写入。这里使用可变列表会导致问题吗? 在子线程中,会发生诸如页面提取和数据库插入之类的活动。

然而,应用程序逐渐增加其内存需求,并最终死锁/饿死到冻结状态或OutOfMemory,如果没有。线程太大了。 我无所适从。如果你遇到过类似的问题,请提出建议。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那么你可以通过将旧线程值设置为null并执行gc()

来绕过OutOfMemory错误

答案 1 :(得分:1)

在开发基于GUI的应用程序时,我遇到了类似的问题。

崩溃的原因

  • 创建一个线程池。使用 您的应用程序中的可用线程 你不能创建无限的线程 这将导致你的崩溃 应用
  • 可能是你在创造新事物 对象(或字符串)和存储 如果可能,数据使用相同的对象 分配值。如果数据很长 您可以存储在文件或数据库中。 而不是始终保持数据

答案 2 :(得分:0)

你有内存泄漏。我建议你在内存不足时进行堆转储并分析它以查看泄漏的位置。

要自动触发堆转储,您可以使用选项

-XX:+HeapDumpOnOutOfMemoryError

也许

-XX:HeapDumpPath=/path/to/heap/dumps

如果你想要一个工作线程池,我建议你使用ExecutorService甚至是ScheduledExecutorService来定期执行任务。 (但这不太可能是你的问题)