当前位置: 代码迷 >> 综合 >> Files.list 不会自动关流
  详细解决方案

Files.list 不会自动关流

热度:45   发布时间:2024-01-20 17:45:05.0

记录一次产线事故

环境 :Linux,Springboot 项目

反馈:服务处理请求大规模失败,报警!

日志显示:too many open files! 

  1. 因为是新申请的服务器,先查看下设置的句柄大小 ulimit -n 发现是 65535,句柄数设置是合理的; 
  2. 因为服务并没有被kill掉,查看当前服务持有的句柄数  ls /proc/${pid}/fd | wc -l  ,发现当前进程持有了大量的句柄未被释放;先重启服务,释放掉句柄再说
  3. 查看日志,发现异常的代码如下demo
    List<Path> collect = Files.list(Paths.get("")).collect(Collectors.toList());
    // ......
  4. Fils.list() 竟然不会自动释放流,MMP!查看源码,发现确实不会自动关闭流。这个设计有点理解不了,因为后面可以接链式方法;
  5. 修复后的代码
    Stream<Path> list = null;
    try {list = Files.list(Paths.get(""));List<Path> collect = list.collect(Collectors.toList());// ......
    } catch (Exception e) {if (list != null) {list.close();}
    }

     

 

  相关解决方案