【问题标题】:debugging tomcat crash调试tomcat崩溃
【发布时间】:2010-12-07 05:43:51
【问题描述】:

我有一个 Tomcat 实例,它会因未知原因定期崩溃。

日志中没有留下任何错误,事件查看器中只有一行显示“Tomcat 意外终止”。

在测试环境中,我无法重现该问题。因此,我主要限于被动监控生产环境。

问题似乎与内存无关,因为意外终止与进程的内存使用没有明显的相关性。

我可以采取哪些步骤来进一步诊断此问题?

编辑:

一些更正/澄清:

它实际上不是Tomcat的一个“实例”,而是几个配置相似的实例。

操作系统是 Windows 2003。

Java 版本是 Java 6。

更新:

看起来问题可能与内存有关。发现了一些在 Tomcat 目录(不是 .../Tomcat/logs)中创建的故障转储。

转储主要包含以下错误:

java.lang.OutOfMemoryError:为 ChunkPool::allocate 请求了 32756 个字节。交换空间不足?

这是出乎意料的,因为进程有时会在其内存使用量相对较低时崩溃(与历史使用量相比)。

在所有转储中,perm gen 空间的使用率为 99%,但从绝对值来看,这种使用情况并不一致,并且远未接近 -XX:MaxPermSize 中指定的限制。

【问题讨论】:

  • 找到原因后请告诉我们原因。

标签: java debugging tomcat


【解决方案1】:

这表明整个 JVM 崩溃了,这是一件相当不寻常的事情。我会考虑以下步骤:

  • 首先检查硬件是否正常。运行 memtest86+ - http://www.memtest86.com/ 或在 Ubuntu cd 上 - 测试内存。让它运行一段时间以绝对确定。
  • 然后看看你使用的Java版本是否ok。 Java 6 的某些版本破坏了一些微妙的功能。在这一点上,最新的 Java 5 可能是一个很好的解决方案。
  • 禁用 Tomcat 本机代码以提高性能。 Tomcat 为 something 使用了一个本地库。由于您的 JVM 崩溃了,因此摆脱原生代码是一个很好的开始。
  • 查看您使用的 Windows 版本是否存在一些限制。终止前的 CPU 使用限制或任何其他配额。

【讨论】:

  • 感谢您的回复。现在我已经排除了硬件故障,因为问题发生在许多不同的服务器上。操作系统是 Windows XP,它似乎没有任何 CPU 使用限制(?)我会看看我是否可以降级 Java 版本,并且仍在尝试找出如何禁用 Tomcat 本机代码。
  • 您能否提供更多关于 Java 6 中被破坏的“微妙功能”的详细信息?
  • 我不记得确切的细节,但我有一些东西——我认为是 Java WebStart——它在 Java 6 的更高版本中得到了修复。你可能有类似的东西,因为有大量的内部修改Java 6 更新 10 尚未被捕获。因此建议尝试使用 Java 5。另请注意,您还有其他选择。 IBM 和 Oracle 都有自己的 JVM,这可能值得一试。还存在其他 Web 容器。根据您的需要,Jetty、Glassfish 或 Geronimo 可以替代。
【解决方案2】:

通常,如果一个进程在 Windows 中崩溃,则会创建一个转储文件。在windbg(windows 调试器)中加载转储文件并获取导致异常的线程的堆栈跟踪。这应该让您更好地了解问题所在。

【讨论】:

  • 在 Windows XP 上也是如此吗?我一直在考虑进行配置更改以获得这样的转储,但如果默认创建一个,那就太好了。
  • 是的,windows也是一样。检查“启动和恢复”设置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 2021-10-01
  • 2023-03-03
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多