Java文件未关闭问题排查过程

Java文件未关闭问题排查过程

  1. 先执行lsof -p pid|wc -l命令查看文件句柄信息,然后排查文件打开数量

  2. 先获取服务的${pid}ps -ef|grep java

  3. 通过${pid}查看服务打开的PDF文件数:lsof -p ${pid}|grep pdf

  4. 调用各个接口检查打开的PDF文件数是否有增加

  5. 找到导致文件数增加的接口,检查代码

  6. 代码中新增了一段通过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();
            }
        }
    }
    
  7. 更新后的代码:

    //正确写法
    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();
                }
            }
        }
    }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值