记一次打开文件数过多问题

文章描述了一次排查和解决Java服务因打开文件过多导致异常的问题。通过jps和lsof命令检查进程和文件描述符,发现在finally块中未正确关闭文件,且有地方read后未关闭并重新赋值,导致文件句柄残留。修复代码逻辑后,服务恢复正常。
摘要由CSDN通过智能技术生成

发现问题

   某天看到日志 发现写入一些文件报错 "too many open files",程序异常对外不能提供正常的服务

寻找原因

   既然打开文件过多,就先看下哪些文件描述符没有被关闭

      1) 首先使用 jps查看下当前的Java服务对应的进程号为37339 

      ​​​2) 然后使用 lsof -p 37339 | wc -l  查看下当前打开文件的个数 发现有一万多个打开的文件,肯定是不正常的,然后 lsof -p 37339 > 1.txt 导出查看了打开某个dat文件过多,于是根据业务知道应该是某个地方没关闭文件

解决问题

     找到读取二进制文件的地方 然后在finally中进行close  但是在程序启动之后仍然有些文件没有关闭,则再次查看读取的逻辑,发现有个地方read之后没有关闭,然后又再次赋值了,导致有些文件句柄残留。增加判断如果文件已经打开了,则不需要赋值。修改之后再次启动观察服务,使用查看打开的文件句柄数量就正常了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值