我在 Centos 7 VPS 上使用 Tomcat 9。该服务器已经运行良好两年了,但最近崩溃了,就像内存不足一样。崩溃发生在新 Tomcat 终止并启动后 1 小时到 24 小时之间。我还重新启动了我的 VPS。我删除了所有应用程序日志,以确保未达到某些限制。任何日志中都没有错误,并且我已经阅读了自 2010 年以来的所有类似问题。
Eclipse MemoryAnalyzer 看起来很有希望,所以我将
HeapDumpOnOutOfMemoryError
标志添加到我的 setenv.sh
中,如下所示:
export JAVA_OPTS="-Xms1500m -Xmx1500m -Xss512m -Xmn1000m -XX:+HeapDumpOnOutOfMemoryError";
echo "setenv.sh has set JAVA_OPTS: $JAVA_OPTS";
我还将所有内存参数增加了 500m。但是,在 JVM 目录或任何其他目录中都没有找到堆文件。
我是该网站的唯一用户。在崩溃之间,我会恢复主页作为 TC 仍然存在的证据,直到最终崩溃。
TC 托管静态内容和两个 WAR 文件。无论我删除其中一个还是两个 WAR,崩溃仍然会发生。我确实通过将版权年份更改为 2021 来更新我的静态页面(我通常在一月份这样做,但今年忘记了)。我已经从备份中提取了原始静态文件,但它仍然崩溃。
任何人都可以提供一些关于如何追踪此问题的其他想法吗?
在评论中看起来好像有一个解决方案,但我对此表示怀疑:
我建议从
JAVA_OPTS
切换到CATALINA_OPTS
(这就是原因)-但这只是一个旁注。
尽管它很有意义,但我不希望它修复任何问题:您的 Tomcat 最终以完全相同的配置运行,只是来自不同的环境变量。
我能想象它修复任何问题(特别是与内存相关)的唯一方法是当
JAVA_OPTS
和 CATALINA_OPTS
都声明不匹配的内存参数并且不知何故,两者中较低的一个获胜。最后,Tomcat 启动时结合了两个参数,JVM 只会解释其中一个(不要问我是第一个、最后一个还是未定义)
我推荐的一般方法仍在评论中:首先排除一个又一个的假设 - 如果您假设有内存问题,则监视内存消耗和垃圾收集。如果您期望 8GB 堆空间,但实际运行在 1GB 上,这一点会很明显。否则内存泄漏就会很明显。一旦您可以排除内存(因为当有足够的可用内存时就会发生崩溃),请继续进行下一个假设。
不太具体...我想知道这个答案是否真的对事后的人有帮助...