我有一个多线程应用程序,可以获取不同的网页。为此,我设计了线程之间的父子关系。 父母只需从其页面中获取不同的URL并生成新线程。这些线程不断获取页面,直到页面更改为止。主线程每两分钟轮询主页上的更改(如果有任何更改,则创建新线程)
主线程算法
while(true){
find_new_instances(...);
if we get any new, then
Thread.start(...);
Thread.sleep(120000);
}
主线程有一个String arraylist,它存储它创建的每个新线程的url。我听说线程应该只使用不可变对象进行写入。这里使用可变列表会导致问题吗? 在子线程中,会发生诸如页面提取和数据库插入之类的活动。
然而,应用程序逐渐增加其内存需求,并最终死锁/饿死到冻结状态或OutOfMemory,如果没有。线程太大了。 我无所适从。如果你遇到过类似的问题,请提出建议。
答案 0 :(得分:1)
如果我理解你的问题,那么你可以通过将旧线程值设置为null并执行gc()
来绕过OutOfMemory错误答案 1 :(得分:1)
在开发基于GUI的应用程序时,我遇到了类似的问题。
崩溃的原因
答案 2 :(得分:0)
你有内存泄漏。我建议你在内存不足时进行堆转储并分析它以查看泄漏的位置。
要自动触发堆转储,您可以使用选项
-XX:+HeapDumpOnOutOfMemoryError
也许
-XX:HeapDumpPath=/path/to/heap/dumps
如果你想要一个工作线程池,我建议你使用ExecutorService甚至是ScheduledExecutorService来定期执行任务。 (但这不太可能是你的问题)