文档章节

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

o
 onedotdot
发布于 07/05 20:48
字数 668
阅读 78
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

    如图是程序运行了一段时间后抛出来的一个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 查看. 

    所以, 我们在对文件操作是, 一定要记得, 先关资源后删文件, 否则一定会造成句柄泄漏!!!  谨记~~~~
————————————————
版权声明:本文为CSDN博主「Hello法克」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41771503/java/article/details/79423013

o
粉丝 13
博文 617
码字总数 16992
作品 0
朝阳
私信 提问
加载中
请先登录后再评论。
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.6K
7
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6K
18
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
6.3K
8
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
6

没有更多内容

加载失败,请刷新页面

加载更多

如何在Pandas的DataFrame中的行上进行迭代? - How to iterate over rows in a DataFrame in Pandas?

问题: I have a DataFrame from pandas: 我有一个来自熊猫的DataFrame : import pandas as pdinp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]df = pd.DataFrame(......

富含淀粉
37分钟前
20
0
与电商节伴生,平台销量榜单背后还有被低估的营销价值

文 | 曾响铃 来源 | 科技向令说(xiangling0815) 时至今日,电商节已经成为各巨头零售平台例行的活动,花样在不断创新,玩法也在不断涌现。 在这个过程中,伴随电商节的各种品牌、产品销量榜...

曾响铃
39分钟前
22
0
volatile关键字详解

前言 提到JAVA的并发编程,就不得不提volatile关键字,不管是在面试还是实际开发中,volatile关键字的使用都是一个应该掌握的技能。它之所以重要,是因为它和JAVA并发编程中会遇到三种重要问...

ls_cherish
今天
10
0
比继承更偏爱组成? - Prefer composition over inheritance?

问题: Why prefer composition over inheritance? 为什么更喜欢使用组合而不是继承? What trade-offs are there for each approach? 每种方法都有哪些取舍? When should you choose inher...

javail
今天
17
0
2020软件测试工程师史上最全面试题(内含答案)-看完BATJ面试官对你竖起大拇指!

以下是软件测试相关的面试题及答案,欢迎大家参考! 我不是至尊宝,也不是孙悟空,我只是那城墙下的一猿。  1、你的测试职业发展是什么?  测试经验越多,测试能力越高。所以我的职业发展是需...

程序员一凡
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部