Java文件未关闭问题排查过程
-
先执行
lsof -p pid|wc -l
命令查看文件句柄信息,然后排查文件打开数量 -
先获取服务的
${pid}
:ps -ef|grep java
-
通过
${pid}
查看服务打开的PDF文件数:lsof -p ${pid}|grep pdf
-
调用各个接口检查打开的PDF文件数是否有增加
-
找到导致文件数增加的接口,检查代码
-
代码中新增了一段通过
PdfReader
打开PDF文件获取CA证书信息用于页面展示功能。由于在for循环里new了PdfReader
对象,而只在最后的finally里关闭PdfReader
导致循环中除了最后一个PdfReader
被关闭外,其他都还占用PDF文件。//错误代码 public JSONObject getCertificateInfos(){ // **这里在最外层定义了reader PdfReader reader = null; try{ // 轮询需要获取证书信息的PDF数组list for(PdfObj pojo:list){ JSONObject item = (JSONObject)JSON.toJSON(pojo); // **在for循环里每次new了PdfReader对象 reader = new PdfReader(pojo.getFilepath); } }catch(Exception e){ log.exceptionLog(e); }finally{ // **在for循环外关闭了reader if(reader != null){ reader.close(); } } }
-
更新后的代码:
//正确写法 public JSONObject getCertificateInfos(){ // 轮询需要获取证书信息的PDF数组list for(PdfObj pojo:list){ JSONObject item = (JSONObject)JSON.toJSON(pojo); PdfReader reader = null; try{ reader = new PdfReader(pojo.getFilepath); }catch(Exception e){ log.exceptionLog(e); }finally{ // **在for循环内关闭每次new的PdfReader对象 if(reader != null){ reader.close(); } } } }