too many open files什么意思,emfile too many open files
最近工作中遇到一个问题,打开文件太多异常,这个异常的最终结果导致Resin停止响应。
在我们的系统中,发现目录是作为文件读取的。但是JDK1.4对这种情况抛出异常,但是打开文件的句柄没有及时释放,最终超过了系统限制。在Linxu下,可以用ulimit -a查看每个进程允许打开的文件数,我们的是1024。
下面的代码解释了这个问题的发生,运行环境:JDK1.4
导入Java . io . *;
公共类测试文件
{
公共静态void main(String[] args)引发异常{
read(/opt/);
thread . sleep(10000);
}
公共静态字符串读取(字符串文件)
{
String ret=null
文件f=null
BufferedInputStream结果=null
ByteArrayOutputStream baos=null;
尝试{
f=新文件(File);
如果(!f.exists()
{
System.out.println(file: file 不存在));
返回ret
}
/*
此处添加是否为文档的判断。
else if(!f.isFile()){
返回null
}
*/
result=new BufferedInputStream(new file inputstream(f));//这里会抛出异常
baos=new ByteArrayOutputStream();
..
ret=new String(baos . tobytearray());
}catch(异常e){
e . printstacktrace();
}最后{
尝试
{
如果(结果!=null)result . close();
如果(baos!=null)baos . close();
f=空;
}catch(异常e) {
e . printstacktrace();
}
}
返回ret
}
}
执行java TestFile后,在线程等待的同时,使用lsof -p查看java进程打开的文件句柄,得到类似如下的结果:
命令PID用户FD类型设备大小节点名称
java 7535敏捷cwd DIR 8,1 4096 326402 /opt
可以看到,虽然读取/opt时会抛出异常,但是文件的句柄并没有被释放,累积的结果就是打开的文件太多。
刚刚在jdk 1.5上测试了一下,这个问题已经解决了。它的提示更加友好:
Java . io . filenotfoundexception:/opt(是一个目录)
而且用lsof -p p查看的时候没有/opt
建议正在jdk1.4上开发的朋友在读文件时要小心。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。