由于内存中断,Tomcat被Docker容器杀死

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

我们的观察是,tomcat进程的内存使用量不断增长,最终达到4g。 然后,内存成本在几分钟到几小时之间随机地保持在99%〜100%之间。 然后,tomcat进程崩溃没有任何错误,如jvm堆oom。

我使用jmap来转储堆时,由docker统计观察的内存消耗大约3.5克。 转储文件大小在400m以下。 使用mat来分析转储文件显示大部分内存部分实际上可能被垃圾收集。 我也手动运行jcmd pid GC.run,这大大减less了内存使用(从2g到1.4g)。

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

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