我们有一个在Java 8上运行的企业应用程序.部署环境是构建的&通过Bitbucket管道更新.我有一个graphic showing the high-level architecture of the environment.除了一些特定于应用程序的环境变量外,我们有两个运行相同配置的应用程序服务器.

直到一周前,在成功运行管道后,其中一台服务器上的2个应用程序实例停止工作,出现以下错误:

There is insufficient memory for the Java Runtime Environment to continue.
Cannot create GC thread. Out of system resources.

这两个实例在另一台服务器上都工作正常.相反,容器无法在此服务器上启动.

已try 的解决方案

错误伴随以下信息:

可能的原因:

可能的解决方案:

  • 减少系统上的内存负载
  • 增加物理内存或交换空间
  • 判断交换备份存储是否已满
  • 减少Java堆大小(-Xmx/-Xms)
  • 减少Java线程数
  • 减少Java线程堆栈大小(-Xss)
  • 使用-XX:ReservedCodeCacheSize设置更大的代码缓存=

我们已经try :

  1. 添加更多交换内存.服务器有8GB的RAM,而我们try 了从4GB到9GB的交换.
  2. 使用堆大小Xms&Xmx从128m到4096m.
  3. 将此服务器上的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

我有几个相关工件的链接.这些包括the failing serverthe operational server上的complete docker logs outputdocker 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

我们现在没有主意了,因为我们已经try 了几乎所有关于堆栈溢出的解决方案.我们错过了什么?

推荐答案

我看到你的Docker镜像使用Ubuntu 22.04 LTS作为基础.最近,在这个LTS版本的基础上重建了基本Java映像,这在较旧的Docker运行时上引起了很多问题.很可能这就是你正在经历的.这与内存无关,而是与Docker与用作基础映像的较新Linux版本的不兼容有关.

操作服务器的Docker server版本为20.10.10,而出现故障的服务器的版本为20.10.09.不兼容问题在Docker 20.10.10中得到了准确修复.有关不兼容问题的更多技术细节,请参阅here.

解决方案是将出现故障的服务器升级到至少Docker 20.10.10.

Java相关问答推荐

如何计算内循环的时间复杂度?

当一个链表中间有一个循环时,它的松散部分会发生什么?

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

路径映射未发生

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

相同的Java SerializedLambda为implMethodKind返回不同的结果

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

与不同顺序的组进行匹配,不重复组但分开

在Java中将int[]矩阵添加到ArrayList中,但出现错误

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

视图被推出线性布局-Android

如何在SWT菜单项文本中保留@字符

判断重复的两个二维表算法?

JavaFX,GridPane:在GridPane的列中生成元素将保持所有列的宽度

spring 更新多项管理关系

使用Java线程进行并行编程

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

声纳覆盖范围为 0%,未生成 jacoco.xml

Java-Apache BufferedHttpEntity 在发送请求时加载整个文件

为什么方法接受协变类型的匿名泛型类对象?