java:too many open files 解决办法

本文详细解析了Linux系统中文件句柄数超限的问题,包括产生原因、如何检查当前句柄数、如何通过命令行及配置文件调整句柄上限,以及分析程序中句柄使用情况的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

产生原因

Linux 中,文件是一个字节序列。这种简单但强大的定义和它的实现使得系统中的所有东西都可以用文件来表示。这里提示的打开文件过多,不仅仅是普通的文件,也包括通讯链接socket,监听端口。这个错误通常是句柄数超出系统限制。

引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数。

  • 通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15065
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15065
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

open files那一行就代表系统目前允许单个进程打开的最大句柄数,这里是1024。

  • 使用命令lsof -p 进程id可以查看单个进程所有打开的文件详情,
$lsof -p 18260
COMMAND   PID USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
java    18260 root  cwd       DIR              253,0        95 51010140 /usr/local/www/auth-provider
java    18260 root  rtd       DIR              253,0       236       64 /
java    18260 root  txt       REG              253,0      8534 50882672 /usr/java/jdk1.8.0_191-amd64/jre/bin/java
java    18260 root  mem       REG              253,0    283312 17363896 /usr/java/jdk1.8.0_191-amd64/jre/lib/amd64/libsunec.so
java    18260 root  mem       REG              253,0     93944 17363886 /usr/java/jdk1.8.0_191-amd64/jre/lib/amd64/libnio.so
java    18260 root  mem       REG              253,0     68192    51221 /usr/lib64/libbz2.so.1.0.6
java    18260 root  mem       REG              253,0    157424    51208 /usr/lib64/liblzma.so.5.2.2
…	…	…	…	…	…	…	…

  • 使用命令lsof -p 进程id | wc -l可以统计进程打开了多少文件
$ lsof -p 18260| wc -l
317

如果文件数过多使用lsof -p 进程id命令无法完全查看的话,可以使用lsof -p 进程id > openfiles.log将执行结果内容输出到日志文件中查看。

解决方法

  • 增大允许打开的文件数——命令方式
ulimit -n 2048

这样就可以把当前用户的最大允许打开文件数量设置为2048了,但这种设置方法在重启后会还原为默认值。
ulimit -n命令 非root用户只能设置到4096。想要设置到更大需要sudo权限或者root用户。

  • 增大允许打开的文件数——修改系统配置文件

修改配置文件/etc/security/limits.conf在最后加入

* soft nofile 4096  
* hard nofile 4096  

或者只加入

 * - nofile 8192

最前的 * 表示所有用户,可根据需要设置某一用户,例如

roy soft nofile 8192  
roy hard nofile 8192  

注意”nofile”项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-“字符设定, 则hard和soft设定会同时被设定。

  • 检查程序问题

如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析。

我遇到的问题

在分析 lsof 返回的详情中,发现socket数据一直增加,觉得是某个资源未释放,导致的。在http请求方面使用hutool-v4.5.0版本,此版本的http请求工具类有缺陷。升级至最新,即可解决。

部分内容摘自:https://blog.csdn.net/qq_18298439/article/details/83896777

### CentOS 镜像中 README 文件的作用 README 文件通常作为文档的一部分,在操作系统或软件包的分发过程中起到指导和说明的作用。对于 CentOS 的镜像而言,其 README 文件的主要意义在于提供关于该版本的操作系统的关键信息以及安装指南。 #### 1. 提供版本信息 README 文件会明确指出当前镜像是哪个具体版本的 CentOS,例如 `CentOS Linux release 7.9.2009 (Core)`[^1]。这有助于用户确认所下载的是正确的发行版,并了解与其兼容的硬件和软件环境。 #### 2. 描述安装前准备事项 在实际部署之前,用户可能需要完成一些必要的准备工作,比如安装工具 Git 或者其他依赖项。这些内容往往会在 README 中有所提及,帮助新手快速上手。 #### 3. 解决常见问题 针对可能出现的问题,如文件上传验证通过后的反馈机制——返回文件名表示成功[^2];或者如何正确配置服务端口映射等复杂场景下的解决方案也可能被记录下来以便查阅。 #### 4. 列举第三方库源地址 有时为了扩展功能,官方文档还会给出获取额外资源的方法论实例:“`wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz`” 就是用来示范怎样从外部站点拉取所需组件的例子之一[^3]。 #### 5. 展示高级设置教程 除了基本操作外,更深入的技术细节也会包含其中,例如为了让 NVM 成为全局变量而修改特定路径下的脚本文件 `/etc/profile.d/nvm.sh` [^4] ,或者是利用 FTP 协议传输大容量数据时推荐采用 Binary Mode 来保持文件完整性[^5]。 综上所述,README 不仅是一个简单的介绍性文本,更是连接开发者与最终用户的桥梁,它承载着丰富的背景资料和技术支持,使得整个安装过程更加顺畅高效。 ```bash # 示例命令展示如何查看本地是否存在类似的 readme 文档 ls /path/to/your/downloaded/image/*.txt | grep -i "readme" cat /path/to/found/readme.txt ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值