我发现自己必须在我的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>)
Run Code Online (Sandbox Code Playgroud)
此堆栈跟踪来自并行程序,但它也发生在顺序程序中.
当你正在使用Groovy中,可以使用便捷的方法,例如File.withReader(),File.withWriter(),File.withInputStream(),InputStream.withStream()以确保资源得到完全关闭.这比使用Java的try .. finally习惯用法要简单得多,因为不需要显式调用close()或在try块外声明变量.
例如,从文件中读取.
File f = new File('/mumble/mumble/')
f.withReader{ r ->
// do stuff with reader here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2280 次 |
| 最近记录: |