在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