Tomcat 正在崩溃且没有错误
Tomcat is crashing without errors
我在 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 已设置 JAVA_OPTS: $JAVA_OPTS";
我还将所有内存参数增加了 500m。但是,在 JVM 目录或任何其他目录中找不到堆文件。
我是网站的唯一用户。在崩溃之间,我恢复主页作为 TC 仍然存在的证据,直到最终崩溃。
TC 托管静态内容和两个 WAR 文件。无论我删除一个或两个 WARs,崩溃仍然发生。我确实通过将版权年份更改为 2021 来更新我的静态页面(我通常在一月份这样做,但今年忘记了)。我已经从备份中提取了原始静态文件,但它仍然崩溃。
任何人都可以提供一些关于如何追踪此问题的其他想法吗?
在评论中似乎有解决方案,但我对此持怀疑态度:
我建议从 JAVA_OPTS
切换到 CATALINA_OPTS
(here's the reason)- 但这只是旁注。
尽管它很有意义,但我不希望它能解决任何问题:你的 Tomcat 最终得到 运行 完全相同的配置,只是来自不同的环境变量。
我能想象它修复任何东西(特别是与内存相关的)的唯一方法是 JAVA_OPTS
和 CATALINA_OPTS
都声明不匹配的内存参数不知何故,两者中较低的一个获胜。最后,Tomcat 以两个参数组合启动,JVM 只会解释其中一个(不要问我是第一个、最后一个还是未定义的)
我推荐的一般方法仍在评论中:首先排除一个又一个假设 - 如果您假设有内存问题,请监控内存消耗和垃圾回收。如果您期望 8GB 堆空间,那将是显而易见的,但您在 1GB 上 运行。否则内存泄漏将是显而易见的。一旦您可以排除内存(因为当有足够的内存可用时会发生崩溃),请遵循下一个假设。
不太具体...我想知道这个答案是否真的对事后的人有所帮助...
我在 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 已设置 JAVA_OPTS: $JAVA_OPTS";
我还将所有内存参数增加了 500m。但是,在 JVM 目录或任何其他目录中找不到堆文件。
我是网站的唯一用户。在崩溃之间,我恢复主页作为 TC 仍然存在的证据,直到最终崩溃。
TC 托管静态内容和两个 WAR 文件。无论我删除一个或两个 WARs,崩溃仍然发生。我确实通过将版权年份更改为 2021 来更新我的静态页面(我通常在一月份这样做,但今年忘记了)。我已经从备份中提取了原始静态文件,但它仍然崩溃。
任何人都可以提供一些关于如何追踪此问题的其他想法吗?
在评论中似乎有解决方案,但我对此持怀疑态度:
我建议从 JAVA_OPTS
切换到 CATALINA_OPTS
(here's the reason)- 但这只是旁注。
尽管它很有意义,但我不希望它能解决任何问题:你的 Tomcat 最终得到 运行 完全相同的配置,只是来自不同的环境变量。
我能想象它修复任何东西(特别是与内存相关的)的唯一方法是 JAVA_OPTS
和 CATALINA_OPTS
都声明不匹配的内存参数不知何故,两者中较低的一个获胜。最后,Tomcat 以两个参数组合启动,JVM 只会解释其中一个(不要问我是第一个、最后一个还是未定义的)
我推荐的一般方法仍在评论中:首先排除一个又一个假设 - 如果您假设有内存问题,请监控内存消耗和垃圾回收。如果您期望 8GB 堆空间,那将是显而易见的,但您在 1GB 上 运行。否则内存泄漏将是显而易见的。一旦您可以排除内存(因为当有足够的内存可用时会发生崩溃),请遵循下一个假设。
不太具体...我想知道这个答案是否真的对事后的人有所帮助...