出现Too many open files报错,我的Java文件处理逻辑是否正确?
Java文件句柄泄漏问题解答
你所使用的try结构的资源释放逻辑说明
你写的这段是Java 7及以上版本提供的try-with-resources语法,放在try后括号内的资源只要实现了AutoCloseable接口,都会在try块执行结束(包括正常执行结束、抛出异常中断)后自动按声明的逆序关闭,不需要额外添加finally块手动关闭。
你用到的FileInputStream、InputStreamReader、LineNumberReader均实现了AutoCloseable接口,这段代码本身的资源释放逻辑没有问题,且代码里的if (in != null)判断属于冗余逻辑,进入try块时in永远不会为null,可直接删除不影响功能。
「too many open files」错误排查方向
- 检查其他未释放的资源:比如代码中传入
printLine方法的bw(Writer对象)是否存在未正确关闭的情况,如果该对象是全局复用、或者每次处理文件新建却没有同步释放,会持续堆积文件句柄。 - 检查操作系统的进程文件句柄限制:Linux系统默认普通进程的最大打开文件数软限制通常为1024,如果你需要处理数千个文件,不管是串行还是并发处理,只要短时间内打开的文件数超过限制就会报错,可执行
ulimit -n查看当前限制,结合业务需要适当调大。 - 控制文件处理并发数:如果是多线程同时运行这段代码处理文件,会出现同时打开数百上千个文件的情况,超过系统限制就会抛出错误,建议限制并发处理的线程数,避免同时打开过多文件。
- 极低概率场景排查:如果使用的是Java 7非常早期的版本(早于7u45),存在极少数try-with-resources资源泄漏的历史bug,可升级JDK版本验证。
内容的提问来源于stack exchange,提问作者Jake1964
相关产品推荐
相关产品推荐

