在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