运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景。

程序经常访问的文件、socket在Linux中都是文件file,系统需要记录每个当前访问file的name、location、access authority等相关信息,这样的一个实体被称为file entry。“open files table”(图中橙色标识)存储这些file entry,以数组的形式线性管理。文件描述符(file descriptor)作为进程到open files table的指针,也就是open files table的下标索引,将每个进程与它所访问的文件关联起来了。

每个进程中都有一个file descriptor table管理当前进程所访问(open or create)的所有文件,文件描述符关联着open files table中文件的file entry。细节不表,对于open files table能容纳多少file entry。Linux系统配置open files table的文件限制,如果超过配置值,就会拒绝其它文件操作的请求,并抛出Too many open files异常。这种限制有系统级和用户级之分。

系统级: 
                系统级设置对所有用户有效。可通过两种方式查看系统最大文件限制 
                1  cat /proc/sys/fs/file-max  
                2  sysctl -a 查看结果中fs.file-max这项的配置数量 
                如果需要增加配置数量就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果属性不存在就添加。 
                配置完成后使用sysctl -p来通知系统启用这项配置

用户级: 
                Linux限制每个登录用户的可连接文件数。可通过  ulimit -n来查看当前有效设置。如果想修改这个值就使用 ulimit -n <setting number> 命令。

对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。

在出现Too many open files问题后,首先得找出主要原因。最大的可能是打开的文件或是socket没有正常关闭。为了定位问题是否由Java进程引起,通过Java进程号查看当前进程占用文件描述符情况:

Java代码  
  1. lsof -p $java_pid 每个文件描述符的具体属性
  2. lsof -p $java_pid | wc -l  当前Java进程file descriptor table中FD的总量

分析命令的结果,可判断问题是否由非正常释放资源所引起。

详解 Too many open files相关推荐

  1. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  2. 基于php下载文件的详解

    基于php下载文件的详解 本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下 php下载文件,比如txt文件. 出现的效果就是,弹出浏览器自带的下载框,出现另存为操作.有时候会出现内存溢 ...

  3. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解

    求$ORACLE_HOME/bin目录下所有命令的使用方法及命令详解 如题. $ORACLE_HOME/bin目录下有很多命令,那我们平时用到的也不是太多,即使用到的那部分可能用法也不是完全能掌握,所 ...

  4. python修改文件内容_Python批量修改文本文件内容的方法详解

    这篇文章主要介绍了Python批量修改文本文件内容的方法的相关资料,需要的朋友可以参考下 Python批量替换文件内容,支持嵌套文件夹 import os path="./" fo ...

  5. OpenCV 畸变校正函数undistortPoints()与remap()详解及校正效果对比

    一.概述 前面写过一篇博客–"疑问:undistortPoints()与remap()畸变校正后,结果相差很大",博客中对比了OpenCV中自带畸变校正函数undistortPoi ...

  6. ATS程序功能和使用方法详解

    转载自https://blog.zymlinux.net/index.php/archives/374 Apache Traffic Server的程序文件,与传统的服务器系统有大不同,这里我们将会对 ...

  7. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解

    文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...

  8. CI流水线配置文件参数详解(一)

    文章目录 4. 参数详解(一) 4.1 ``script`` 4.2 ``image`` 指定使用Docker镜像.如 ``iamge:name`` ,暂时忽略. 4.3 ``before_scrip ...

  9. 【SVN】linux下svn命令参数详解(二)

    svn全部子命令详解 1.svn help 2.svn add 3.svn blame 4.svn cat 5.svn changelist 6.svn checkout 7.svn cleanup ...

最新文章

  1. 推荐阅读《赢在下班后》
  2. 【转】使用Apache Kylin搭建企业级开源大数据分析平台
  3. relation does not exist报错是什么意思_为什么Zookeeper天生就是一副分布式锁的胚子?...
  4. CF401C-Team【构造】
  5. sx1268 中文_STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)
  6. Hades:移动端静态分析框架
  7. [国嵌笔记][025][ARM指令分类学习]
  8. dockerfile 创建自定义的tomcat服务
  9. [bzoj1497][NOI2006]最大获利_网络流_最小割
  10. C++虚函数调用的反汇编解析
  11. 关于网站版权声明(Copyright)的格式和写法
  12. python基础之语句_python基础之条件语句
  13. 使用Zbar进行二维码识别 中文字符解码 RawBytes
  14. SHOPNC 插件机制的实现记录
  15. IT人职业道德的反思
  16. Maven(保姆级全详)新手入门
  17. 嵌入式:ARM中断系统设计全解
  18. Ubuntu 18.04 ———(Intel RealSense D435i)安装相机的驱动librealsense + realsense-ros
  19. 百度提示:违法违规网页,建议关闭的解决方案
  20. 【自然语言处理】潜在语义分析【下】概率潜在语义分析

热门文章

  1. postgresql语句
  2. springboot 使用idea打包 遇到问题
  3. 1.数据库和表的创建
  4. 自定义浏览器协议,实现web程序调用本地程序
  5. C++ map嵌套使用 链接
  6. 关于bin和obj文件夹。debug 和release的区别(转)
  7. SQL/T-SQL/PLSQL
  8. Cookies揭秘 [Asp.Net, Javascript]
  9. 如何自定义IHttpHandler
  10. windows远程桌面超出最大连接数强制登录命令