我们有一个运行在Java 8上的企业应用程序。部署环境是通过Bitbucket pipelines构建和更新的。我有一个显示环境高级架构的图形(点击查看)。我们有两个应用服务器,除了一些特定于应用程序的环境变量之外,它们运行相同的配置。
一切都很顺利,直到一个星期前,在成功运行pipeline后,其中一个服务器上的2个应用程序实例停止工作,并显示以下错误:
There is insufficient memory for the Java Runtime Environment to continue.
Cannot create GC thread. Out of system resources.
另一台服务器上两个实例都正常工作,但在这台服务器上容器无法启动。
尝试的解决方案
错误附带以下信息:
可能的原因: 系统物理 RAM 或交换空间已用完 进程正在运行并启用了 CompressedOops,Java 堆可能会阻塞本地堆的增长。
可能的解决方案:
- 减少系统的内存负载
- 增加物理内存或交换空间
- 检查交换后备存储是否已满
- 减小 Java 堆大小(-Xmx/-Xms)
- 减少 Java 线程数目
- 减小 Java 线程堆栈大小(-Xss)
- 使用 -XX:ReservedCodeCacheSize= 设置更大的代码缓存
我们已经尝试了:
- 添加更多的交换空间。服务器具有 8GB 的 RAM,而我们已经尝试将交换空间从 4GB 增加到 9GB。
- 更改堆大小 Xms 和 Xmx,从 128m 到 4096m。
- 将该服务器的 RAM 增加到 16GB,而仍然在 8GB 上工作的其他服务器也是如此。
以下是内存和交换空间占用情况:
free -mh
total used free shared buff/cache available
Mem: 15Gi 378Mi 12Gi 1.0Mi 2.9Gi 14Gi
Swap: 9Gi 0B 9Gi
我有几个相关文物的链接。这些包括完整的docker logs
输出以及在失败的服务器上和运行良好的服务器上的docker info
输出。
这是docker ps -a
返回的结果:
:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d29747bf2ad3 :a7608a838625ae945bd0a06fea9451f8bf11ebe4 "catalina.sh run" 10 hours ago Exited (1) 10 hours ago jbbatch
0951b6eb5d42 :a7608a838625ae945bd0a06fea9451f8bf11ebe4 "catalina.sh run" 10 hours ago Exited (1) 10 hours ago jbapp
我们现在已经尝试了 Stack Overflow 上几乎所有的解决方案,但是我们还是没有头绪。我们错过了什么吗?