【发布时间】:2021-09-11 04:47:41
【问题描述】:
我在 Centos 7 VPS 上使用 Tomcat 9。这台服务器已经运行了两年,但最近崩溃了,好像内存不足一样。崩溃发生在新的 Tomcat 杀死并启动后 1 小时到 24 小时之间。我也重新启动了我的 VPS。我删除了所有应用程序日志,以确保未达到某些限制。任何日志中都没有错误,而且我已经阅读了可以追溯到 2010 年的所有类似问题。
Eclipse MemoryAnalyzer 看起来很有希望,所以我将HeapDumpOnOutOfMemoryError 标志添加到我的setenv.sh 中,如图所示:
导出 JAVA_OPTS="-Xms1500m -Xmx1500m -Xss512m -Xmn1000m -XX:+HeapDumpOnOutOfMemoryError"; echo "setenv.sh 已设置 JAVA_OPTS: $JAVA_OPTS";
我还将所有内存参数增加了 500m。但是,在 JVM 目录或任何其他目录中没有找到堆文件。
我是该网站的唯一用户。在崩溃之间,我将主页恢复为 TC 仍然存在的证据,直到最终崩溃。
TC 托管静态内容和两个 WAR 文件。无论我删除一个或两个 WAR,崩溃仍然会发生。我确实通过将版权年份更改为 2021 年更新了我的静态页面(我通常在一月份这样做,但今年忘记了)。我已经从备份中提取了原始静态文件,但它仍然崩溃。
任何人都可以提供一些其他关于如何追踪这一点的想法吗?
【问题讨论】:
-
你说“崩溃好像内存不足” - 这意味着崩溃的原因可以是任何东西。此外,许多人将“崩溃”用作任何导致应用程序无法按预期做出反应的通用词:进程是否终止? (你说:“在 tomcat 被杀死并重新启动之后——这意味着 JVM 仍在运行。是吗?)你看到了什么日志条目?你可能想在
CATALINA_OPTS中配置 Tomcat,而不是在JAVA_OPTS中,特别是当您为进程提供大量内存时。 -
崩溃是指 ps -aux | grep tomcat 不再显示 PID 列表。是的,不需要 pkill -9 -f tomcat,只是出于习惯。
-
据我所知,JVM 没有崩溃。我知道确认的唯一方法是查找 hs_err_pidXXXX.log,完整的系统搜索找不到任何内容。我会按照你的建议尝试
CATALINA_OPTS。没有意识到高内存对 JVM 的设置方式有影响。 -
交叉引用JAVA_OPTS vs CATALINA_OPTS 方面。要找出如果您有内存问题:将
jconsole连接到您的进程并以这种方式监控它。您将了解内存消耗 - 如果您可以排除这种情况,那就不用担心了。但是你必须想出一个不同的假设。 -
Olaf,我按照您的建议切换到
CATALINA_OPTS(我确实在切换之前发现了 SO 帖子 11222365,现在我完全理解了其中的区别)。 26 小时后仍在工作,因此我将其称为已修复。您介意将其添加为解决方案吗?我将选择它作为实际解决方案,以便人们可以更轻松地找到它 - 如您所知,许多人不浏览 cmets。谢谢。