Linux 文件打开过多 (Too many open files)

本文通过一个具体的Java示例详细解析了Linux系统中句柄泄漏的原因及预防措施,强调了在进行文件操作时正确关闭资源的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


    如图是程序运行了一段时间后抛出来的一个bug, 刚开始看这个bug的时候各种网上找答案, 无外乎教你怎么改ulimit(就是linux最大打开文件数), 当然不是说改这个没有用, 作为程序开发者来说, 如果程序运行出现了bug则必然是程序的问题, 毕竟linux系统已经相当成熟, 它不会欺骗你(作为小菜鸟的我也是刚认识到这一点).

    今天遇到的这种bug, 的确是程序上的原因. 具体什么原因, 下面开始我的表演.

 我们知道linux中对于某个进程打开的文件句柄是有限制的, 这里的意识不是指简单new一个File对象.其实你new 一亿个文件对象放在那边, linux都不会来警告你. 这里的限制是我们new 了一个FIle, 并且使用了这个句柄搞事情. 如下面的代码

    

import org.testng.annotations.Test;

import java.io.*;

/**
 * Created by fire on 2018-03-02 14:45:02.
 */
public class File_new {

    @Test
    public void test1(){
        File f1 = new File("G:/state/a.txt");
        File f2 = new File("G:/state/b.txt");
        File f3 = new File("G:/state/c.txt");
        File f4 = new File("G:/state/d.txt");

        String line = null;
        BufferedReader br = null;
        try{
            br = new BufferedReader(new InputStreamReader(new FileInputStream(f1)));
            f1.delete();  //
            while ((line = br.readLine()) != null){
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(br != null){
                try {
                    br.close();
                    br = null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

    上面代码new了很多File对象, 但是真正打开的只有f1. linux限制的就是这个f1句柄.  然饿, 如果, 像上面的代码这样写个10000遍, 则一定会被linux限制到, 因为这里就存在了一个句柄泄漏的问题.  当我们把打开的句柄删除的时候, 一定要记得把用到它的所有资源都要关闭掉, 不然一定会造成句柄泄漏. 不信可以在linux 用 lsof -p + 进程的PID 查看. 

    所以, 我们在对文件操作是, 一定要记得, 先关资源后删文件, 否则一定会造成句柄泄漏!!!  谨记~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值