我发现自己必须在我的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>)
此堆栈跟踪来自并行程序,但它也发生在顺序程序中。
答案 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();
}