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

相關文章
相關標籤/搜索