too many open files什么意思,emfile too many open files

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: