☰
【Docker 运维】Java 应用在 Docker 容器中启动报错:`unable to allocate file descriptor table`
2026/11/3 1:24:02 网站建设 项目流程

文章目录

    • 一、根本原因
    • 二、判断与排查方法
    • 三、解决方法
      • 1、限制 Docker 容器的文件描述符上限
      • 2、在执行脚本中动态设置ulimit的值
      • 3、升级至 Java 11+
    • 四、总结

容器内执行脚本时报错如下,Java 进程异常退出:

library initialization failed - unable to allocatefiledescriptor table - out of memory /entrypoint.sh: line2:6Aborted(core dumped)java...

一、根本原因

该问题源于Java 8 的 JDK Bug(JDK-8150460):

  • Java 8 在启动时,会尝试根据当前系统ulimit -n值,预分配文件描述符表的内存块;
  • 在现代系统中默认ulimit -n值通常为65535或更高;
  • 在容器资源受限或配置不当的情况下,native 层内存不足,JVM 启动失败,抛出unable to allocate file descriptor table。

此外还有两个系统环境相关的影响:

  1. 旧版本的 systemd 不支持LimitNOFILE=infinity生效;
  2. Docker 容器的默认ulimit配置可能不足,或者过大触发此问题。

二、判断与排查方法

## 1. 确认容器内的 `ulimit` 值dockerexec<container_id>ulimit-n## 2. 检查系统 systemd 版本systemctl--version若版本<234,`infinity`设置不会生效。## 3. 确认是否为 Java 8java-version

三、解决方法

1、限制 Docker 容器的文件描述符上限

将容器启动参数中显式设置ulimit -n:

dockerrun--ulimitnofile=1024:1024-d-p8080:8080 your-image

或者在docker-compose.yml中配置:

ulimits:nofile:soft:1024hard:1024

推荐设置为 8192 以下,如 1024、4096 等。

2、在执行脚本中动态设置ulimit的值

参考:【stackoverflow】Error upon jar execution - unable to allocate file descriptor table

3、升级至 Java 11+

此问题在 Java 9+ 已被修复。

四、总结

项目推荐做法
问题本质Java 8 + 高ulimit -n导致 native 层分配失败
快速修复--ulimit nofile=1024:1024限制容器文件句柄
永久方案配置 systemd 或升级 JDK
最优解切换 Java 11+,从根源上解决

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询