【问题标题】:Tomcat get killed by docker container due to memory outage由于内存中断,Tomcat 被 docker 容器杀死
【发布时间】:2018-01-11 08:30:09
【问题描述】:

我最近正在使用 tomcat 开发一项休息服务。我设置了 JAVA_OPTS = -Xmx1648m -Xmn1648 -server 并确保它们已经生效。 docker 正在运行,内存限制设置为 4g。

观察是tomcat进程的内存使用量不断增长,最终达到4g。然后,内存成本在几分钟到几小时之间随机保持在 99% ~ 100% 之间。然后,tomcat进程崩溃,没有像jvm heap oom这样的错误。

当 docker stats 观察到的内存消耗约为 3.5g 时,我使用 jmap 转储堆。转储文件大小低于 400m。使用 mat 分析转储文件显示大多数内存部分实际上可以被垃圾收集。我还手动运行 jcmd pid GC.run,这大大减少了内存使用量(从 2g 到 1.4g)。

我的检查是tomcat从来没有达到jvm设置的限制,否则应该有jvm heap oom的错误日志。然后,内存应该被 jvm 或 tomcat 中的其他线程消耗。但我找不到解决这个问题的方法。请帮忙!

【问题讨论】:

    标签: tomcat docker memory jvm


    【解决方案1】:

    当 Xmx 设置为 1648 即 1.4G 时,JVM 将不会使用更多。如果存在内存分配问题,则可能导致 OOM。当您说“内存成本保持在 99% ~ 100% 之间”时,您是指 RAM 内存吗?在这种情况下,您的 RAM 大小是多少?你的任务负载是多少?您是否在进行频繁的 I/O 操作?

    【讨论】:

    • 是的,RAM 内存。 RAM 大小受 docker 容器限制,即 4g。任务负载确实是频繁的 I/O。当收到请求时,我们会做一些 MySQL 插入,并将文件从其源路径复制到目标路径。
    • RAM 和堆内存是独立的实体。当它达到阈值时可能会有一些操作系统终止进程,这个问题与java堆无关。可能是一些操作系统限制。
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2020-06-30
    相关资源
    最近更新 更多