在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
参考地址: