具有修复池大小和许多任务的ThreadPoolExecutor

时间:2011-06-15 12:48:55

标签: java out-of-memory

我遇到ThreadPoolExecutor问题。有一个包含许多文件名的列表。 我想用多线程处理这些文件。我一次只想要2个或4个线程(取决于处理器)。有时如果文件很长,我会遇到内存异常。 我没有结果地调查了这个问题......

代码:

ThreadPoolExecutor executor = new   ThreadPoolExecutor(2, 2,
                0L, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(20));

我将文件名存储在列表中,然后逐个遍历列表并调用execute()方法。

for(String fileName : fileNames) {
   executor.execute(new FileProcess(fileName));
}    

然后shutdown() poolThread并等待每个线程完成。

    if (ProjectsHandler.withThread){
        executor.shutdown();
        while(!executor.isTerminated()) {
            // wait until all threads are finish
        }
    }

所以我给出了内存异常。分析器说原因是ThreadPoolExecutor。 如果我用1个线程运行程序一切正常,没有例外。

可能是什么问题? 提前致谢

2 个答案:

答案 0 :(得分:1)

我不认为问题与线程有关。如果你并行运行两个任务,并且它们都需要256MB,而你只有384MB(例如),那么你的内存就会耗尽。如果按顺序运行它们,没有线程,你会没事(但需要更长时间)。

您应该查看内存不足异常的原因。尝试减少JVM可用的内存,直到单线程版本触发它为止。这样可以更容易调试。

答案 1 :(得分:0)

如果我不得不猜测,我敢打赌你的FileProcess类读入你正在处理的文件的全部内容并将其存储在内存中的集合中。我还猜测你正在使用默认内存启动JVM,而不是那么多。

在启动程序时,尝试使用-Xmx 1024M作为JVM命令行参数的一部分。