Too many open files 问题

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

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

        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) {
            }
        }

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

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

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

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

另外可能须要查看整个linux的进程的句柄占用状况,能够使用下边脚本:socket

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

 

参考地址:spa

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

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

相关文章
相关标签/搜索