Too many open files 问题

在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。

Java代码中的文件句柄没有关闭,或者socket连接过多都会引起Too many open files 问题,文件代码示例如下:

        RandomAccessFile randomFile =null;
        try {
            File logFile = new File(filepath);
            randomFile = new RandomAccessFile(logFile, "rw");
            randomFile.seek(lastTimeFileSize);
            StringBuffer bf = new StringBuffer();
            String tmp = "";
            while ((tmp = randomFile.readLine()) != null) {
                bf.append(new String(tmp.getBytes("iso8859-1"), "utf-8")).append("<br>");
            }
            lastTimeFileSize = randomFile.length();

        } catch (Exception e) {

        } finally {
            try {
                if (null != randomFile)
                    //randomFile.close(); //未调用
            } catch (Exception e) {
            }
        }

上边代码调用一次会是程序占用的文件句柄增加一次,如果不断调用会达到句柄的最大值。

如何查看呢,通过Java进程号查看当前进程占用文件描述符情况:

lsof -p $java_pid 每个文件描述符的具体属性
lsof -p $java_pid | wc -l  当前Java进程file descriptor table中FD的总量

上述示例问题只要调用randomFile.close();关闭文件句柄就可以解决。

另外可能需要查看整个linux的进程的句柄占用情况,可以使用下边脚本:

# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more

 

参考地址:

http://blog.sina.com.cn/s/blog_4550f3ca01011qov.html

http://langyu.iteye.com/blog/763247

posted @ 2016-05-20 14:56  熊猫太郎  阅读(515)  评论(0编辑  收藏  举报