【问题标题】:Tomcat is crashing without errorsTomcat崩溃没有错误
【发布时间】: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。谢谢。

标签: java tomcat war


【解决方案1】:

在 cmets 中看起来有解决方案,但我对此持怀疑态度:

我建议从 JAVA_OPTS 切换到 CATALINA_OPTS (here's the reason)- 但这只是一个旁注。 尽管它是有道理的,但我不希望它解决任何问题:您的 Tomcat 最终会以完全相同的配置运行,只是来自不同的环境变量。

我可以想象它修复任何东西(特别是与内存相关)的唯一方法是JAVA_OPTS CATALINA_OPTS 声明不匹配的内存参数并且不知何故两者中较低的参数获胜。最终,Tomcat是通过两个参数组合启动的,JVM只会解释其中一个(不要问我是第一个,最后一个还是未定义)

我推荐的通用方法仍然在 cmets 中:首先排除一个又一个假设 - 如果您假设您有内存问题,请监控内存消耗和垃圾收集。如果您期望 8GB 堆空间,那将是显而易见的,但您运行的是 1GB。否则内存泄漏将是显而易见的。一旦您可以排除内存(因为当有大量可用内存时会发生崩溃),请继续进行下一个假设。

不太具体...我想知道这个答案是否真的对事后的人有所帮助...

【讨论】:

  • 我做过Tomcat级别和JVM级别的内存分析。我在 VPS 中使用的 cPanel 有一些很好的工具,而且它们看起来很准确。我毫无疑问地知道两件事:1)我在 VPS 上的 Tomcat 设置在 2 年内没有改变。几周前它开始崩溃。对静态文件进行了微小的更改并启动了 TC,所有测试都通过了。大约 2 小时后,TC 崩溃了。我杀死了 TC,从备份中恢复,启动,在 3 小时内崩溃。 2)我把setenv.sh改成了CATALINA_OPTS,杀死了TC,把所有改变的文件放回去,启动了TC,38小时后还在运行。无法解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多