You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地Linux机器执行JAR报错:无法分配文件描述符表

解决Linux下运行JAR包报文件描述符表分配失败的问题

这个问题我之前帮人排查过好几次,虽然你的机器有32G内存,但这个报错指向的是文件描述符表分配失败,不是堆内存不足,得从文件描述符限制和系统资源配置入手,一步步来:

  • 先检查当前用户的文件描述符限制
    打开终端,先跑这两个命令看看当前的限制:

    ulimit -n  # 查看当前软限制(用户能修改的上限)
    ulimit -Hn # 查看硬限制(系统级的最高上限)
    

    如果输出是默认的1024或者很小的数值,那基本就是这个限制太低导致的问题。

  • 临时调整限制测试
    先临时把软限制调高,比如设到65535:

    ulimit -n 65535
    

    然后再尝试运行你的JAR包,如果能正常启动,就说明是文件描述符限制的问题,接下来做永久配置。

  • 永久修改用户级限制
    编辑你的用户配置文件,比如~/.bashrc或者~/.profile,在末尾添加一行:

    ulimit -n 65535
    

    保存后执行source ~/.bashrc让配置立即生效,下次登录终端时会自动应用这个限制。

  • 如果系统级限制不够,调整全局配置
    如果刚才的硬限制也很低,就得修改系统全局配置:

    1. 编辑/etc/security/limits.conf,添加以下内容:
      * soft nofile 65535
      * hard nofile 65535
      
    2. 编辑/etc/pam.d/common-session,确保存在这一行(如果没有就加上):
      session required pam_limits.so
      

    完成后重启机器,系统级的文件描述符限制就会生效。

  • 排查JVM参数是否挤占系统内存
    有时候如果给JVM设置的堆内存太大(比如-Xmx28G),会导致系统剩余内存不足,无法为文件描述符表分配空间。可以适当调低-Xmx的值,比如设为-Xmx24G,给系统留足4-8G的内存空间,再试试运行JAR包。

  • 检查程序是否存在资源泄漏
    如果调整限制后还是报错,那可能是程序本身打开了大量文件、套接字但没有及时释放,导致文件描述符耗尽。可以在程序运行时用lsof -p <进程ID>查看它打开的文件数量,如果数值接近你设置的上限,就得排查代码里的资源泄漏问题了。

内容的提问来源于stack exchange,提问作者user680111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:25:57