为什么我会收到“打开文件太多”的错误?

时间:2011-09-27 13:54:51

标签: java groovy

我发现自己必须在我的Groovy脚本中显式调用System.gc()以防止出现如下错误。垃圾收集器为什么不为我这样做?有什么我可以做的,以使其垃圾收集,以防止这些错误(可能是JAVA_OPTS)?

Caught: java.util.concurrent.ExecutionException: org.codehaus.groovy.runtime.InvokerInvocationException: java.io.IOException: Cannot run program "ls": java.io.IOException: error=24, Too many open files
    at groovyx.gpars.GParsPool.runForkJoin(GParsPool.groovy:305)
    at UsageAnalyzer$_run_closure2_closure6.doCall(UsageAnalyzer.groovy:36)
    at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy:170)
    at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy)
    at groovyx.gpars.GParsPool.withExistingPool(GParsPool.groovy:169)
    at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:141)
    at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:117)
    at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:96)
    at UsageAnalyzer$_run_closure2.doCall(<removed>)
    at UsageAnalyzer.run(<removed>)

此堆栈跟踪来自并行程序,但它也发生在顺序程序中。

2 个答案:

答案 0 :(得分:6)

当您使用groovy时,您可以使用方便的方法,例如File.withReader()File.withWriter()File.withInputStream()InputStream.withStream(),以确保资源干净地关闭。这比使用Java try .. finally惯用语要简单得多,因为不需要显式调用close(),或在try块之外声明变量。

e.g。从文件中读取。

File f = new File('/mumble/mumble/')
f.withReader{ r -> 
   // do stuff with reader here
}

答案 1 :(得分:3)

绝对查找您打开文件或流的任何地方,确保关闭它们。将它们包裹起来通常是有益的:

final InputStream in = ...;
try
{
    // Do whatever.
}
finally
{
    // Will always close the stream, regardless of exceptions, return statements, etc.
    in.close();
}