Java多个进程并行运行导致打开文件指针异常

时间:2013-05-23 11:18:05

标签: java exception parallel-processing

我有两个计划一个接一个地运行的Java程序。当它们按顺序运行而没有重叠时,就没有问题。但有时其中一个会因为处理的音量而延长一点时间,而第二个则在第一个结束之前开始。现在,当第二个在完成一半时发生这种情况时,它会崩溃,从而导致Max no文件打开异常。第一个成功完成了。单独运行时,使用相同的卷,它们中的任何一个都没有问题。这两个进程完全相互独立 - 没有公共资源,从不同的脚本调用,最后是2个不同的进程在2个不同的JVM上运行在同一个操作系统上 - 我使用HP-UNIX系统并尝试使用以下方法跟踪打开的句柄TUSC实用程序,但没有任何可能导致这样的问题。 Xmx对于两者来说都是2Gigs,我怀疑是否会达到 - 但是有没有解释这个我没有看到?并行运行可能是一个问题,还是巧合?

2 个答案:

答案 0 :(得分:2)

您的问题的解决方案可能是提高文件描述符限制(请参阅下面的链接),或者确保您的代码正确关闭资源(文件输入流,套接字),这样您就不会泄漏打开的文件描述符。我会告诉你你采取哪种方法。

http://h20000.www2.hp.com/bc/docs/support/SupportManual/c02261152/c02261152.pdf

修改

如果你的程序确实一次生成那么多文件,我肯定会考虑提高打开文件描述符的限制。然后,您可能还会考虑在代码中加入油门/调节器。创建X个文件,然后退回几秒钟,让系统重新获得资源,然后再继续。这可能会有所帮助。

此外,此链接听起来与您的问题非常相似:

Apache FOP 1.0 Multithreading - Too many open files err24

答案 1 :(得分:0)

在类似的场景和资源限制中,我们使用了以下架构。

将首先启动一个监视器线程,它将具有一个计数变量。将有一个可配置的限制,直到该限制将创建新进程。对于每个新进程,count变量将递增。完成该过程后,count变量将递减。仅当计数小于配置的限制时,才会创建新进程。

以上方法帮助我们获得了更好的控制,并且能够在任何可能的地方扩大规模。