Java 具有固定池大小和多任务的ThreadPoolExecutor
我对ThreadPoolExecutor有问题。有一个包含许多文件名的列表。 我想用多线程处理这些文件。我一次只需要2或4个线程(取决于处理器)。有时,如果文件很长,我会出现内存不足的异常。 我调查了这个问题没有结果 守则:Java 具有固定池大小和多任务的ThreadPoolExecutor,java,out-of-memory,Java,Out Of Memory,我对ThreadPoolExecutor有问题。有一个包含许多文件名的列表。 我想用多线程处理这些文件。我一次只需要2或4个线程(取决于处理器)。有时,如果文件很长,我会出现内存不足的异常。 我调查了这个问题没有结果 守则: ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 2, 0L, TimeUnit.MILLISECONDS, new ArrayBlocking
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 2,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(20));
然后shutdown()
if (ProjectsHandler.withThread){
executor.shutdown();
while(!executor.isTerminated()) {
// wait until all threads are finish
}
}
所以我给出了内存不足的异常。分析人员说原因是ThreadPoolExecutor。
如果我用一个线程运行程序,一切正常,没有异常
有什么问题吗?
提前感谢我认为问题与线程无关。如果您并行运行两个任务,并且它们都需要256MB,而您只有384MB(例如),那么您将耗尽内存。如果您按顺序运行它们,而不使用线程,您会很好(但需要更长的时间)
您应该查看内存不足异常的原因。尝试减少JVM可用的内存,直到单线程版本触发它。这将使调试更容易。如果我不得不猜测,我敢打赌您的FileProcess
类将读取您正在处理的文件的全部内容,并将其存储在内存集合中。我还想,您启动JVM时使用的默认内存不是那么多
启动程序时,尝试使用-Xmx 1024M
作为JVM命令行参数的一部分。我假设这是一个输入错误-ThreadPoolExecutor executor+new ThreadPoolExecutor
yepp这是一个输入错误。谢谢FileProcess处理所有的文件读取和处理工作。我用-Xmx试过了,效果很好。我只是想知道我是在程序中犯了一些错误,还是由于文件大小的原因,它只会消耗内存。@hcpeter可能两者都有一点,但如果安全地假设您永远不会同时遇到一个千兆字节的文件数据,我不会重新构造程序。默认情况下,JVM只允许64M或内存不仅存储程序数据,还存储线程堆栈和类数据(字节码)。即使程序只有一个线程,尝试处理100M的文件也会导致程序失败,因为文件数据大于程序内存。如果答案有效,接受它是一种常见的礼貌。
if (ProjectsHandler.withThread){
executor.shutdown();
while(!executor.isTerminated()) {
// wait until all threads are finish
}
}