我们在 docker 容器(官方 docker 镜像)上运行了一个 tomcat7。在高峰时段,一段时间后,tomcat 会挂起,无法再处理请求(许多请求被卡住并无限期等待)。
以下是“manager-app”的详细信息:
JVM
可用内存:627.21 MB 总内存:1751.50 MB 最大内存:10923.00 MB
http-apr-8080
最大线程数:500 当前线程数:500 当前线程繁忙:500 保持活动套接字数:0 最大处理时间:871759 毫秒 处理时间:412926.78 秒 请求数:3466023 错误数:326 接收字节数:354.74 MB 发送字节数:1371.40 MB
连接部分
X500 条目如下:
S 166957 毫秒 0 KB 0 KB ip1 ip2 api.app.url POST /do1 HTTP/1.1 ...
知道为什么会发生这种情况吗?
PS-似乎总内存太低(考虑到可用内存明显较低)这是什么原因造成的?
答案1
Java 应用程序可能无法在 Docker 等容器中按预期运行,这主要与垃圾收集有关,因为没有提供足够的 CPU 配额,并且运行大量线程的情况可能会变得更糟。
我建议您查看一下垃圾收集日志并分析完整的 GC,它可能表明存在内存压力,并且还表明存在 CPU 利用率。
看看这个文章这可能会有帮助