发现问题
某天看到日志 发现写入一些文件报错 "too many open files",程序异常对外不能提供正常的服务
寻找原因
既然打开文件过多,就先看下哪些文件描述符没有被关闭
1) 首先使用 jps查看下当前的Java服务对应的进程号为37339
2) 然后使用 lsof -p 37339 | wc -l 查看下当前打开文件的个数 发现有一万多个打开的文件,肯定是不正常的,然后 lsof -p 37339 > 1.txt 导出查看了打开某个dat文件过多,于是根据业务知道应该是某个地方没关闭文件
解决问题
找到读取二进制文件的地方 然后在finally中进行close 但是在程序启动之后仍然有些文件没有关闭,则再次查看读取的逻辑,发现有个地方read之后没有关闭,然后又再次赋值了,导致有些文件句柄残留。增加判断如果文件已经打开了,则不需要赋值。修改之后再次启动观察服务,使用查看打开的文件句柄数量就正常了