本地Linux机器执行JAR报错:无法分配文件描述符表
解决Linux下运行JAR包报文件描述符表分配失败的问题
这个问题我之前帮人排查过好几次,虽然你的机器有32G内存,但这个报错指向的是文件描述符表分配失败,不是堆内存不足,得从文件描述符限制和系统资源配置入手,一步步来:
先检查当前用户的文件描述符限制
打开终端,先跑这两个命令看看当前的限制:ulimit -n # 查看当前软限制(用户能修改的上限) ulimit -Hn # 查看硬限制(系统级的最高上限)如果输出是默认的1024或者很小的数值,那基本就是这个限制太低导致的问题。
临时调整限制测试
先临时把软限制调高,比如设到65535:ulimit -n 65535然后再尝试运行你的JAR包,如果能正常启动,就说明是文件描述符限制的问题,接下来做永久配置。
永久修改用户级限制
编辑你的用户配置文件,比如~/.bashrc或者~/.profile,在末尾添加一行:ulimit -n 65535保存后执行
source ~/.bashrc让配置立即生效,下次登录终端时会自动应用这个限制。如果系统级限制不够,调整全局配置
如果刚才的硬限制也很低,就得修改系统全局配置:- 编辑
/etc/security/limits.conf,添加以下内容:* soft nofile 65535 * hard nofile 65535 - 编辑
/etc/pam.d/common-session,确保存在这一行(如果没有就加上):session required pam_limits.so
完成后重启机器,系统级的文件描述符限制就会生效。
- 编辑
排查JVM参数是否挤占系统内存
有时候如果给JVM设置的堆内存太大(比如-Xmx28G),会导致系统剩余内存不足,无法为文件描述符表分配空间。可以适当调低-Xmx的值,比如设为-Xmx24G,给系统留足4-8G的内存空间,再试试运行JAR包。检查程序是否存在资源泄漏
如果调整限制后还是报错,那可能是程序本身打开了大量文件、套接字但没有及时释放,导致文件描述符耗尽。可以在程序运行时用lsof -p <进程ID>查看它打开的文件数量,如果数值接近你设置的上限,就得排查代码里的资源泄漏问题了。
内容的提问来源于stack exchange,提问作者user680111
相关产品推荐
相关产品推荐

