Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有固定池大小和多任务的ThreadPoolExecutor_Java_Out Of Memory - Fatal编程技术网

Java 具有固定池大小和多任务的ThreadPoolExecutor

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有问题。有一个包含许多文件名的列表。 我想用多线程处理这些文件。我一次只需要2或4个线程(取决于处理器)。有时,如果文件很长,我会出现内存不足的异常。 我调查了这个问题没有结果

守则:

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
        }
    }