尝试在 64 位 linux (CentOS) 机器上诊断一些奇怪的 Tomcat (7.0.21
) 和/或 JVM 错误。
我正在对我们的服务器应用程序进行负载测试,并尝试用 10 万条消息对其进行测试。启动 jvisualvm
并一直关注堆。一切看起来都很棒*(见下文),直到我处理了大约 93K 条消息,然后 Tomcat 才死掉了。对 Tomcat 的 PID 号运行 ps
以确认它已死。
直到这次崩溃:
- 负载测试已经运行了大约 90 分钟;因为我们在 93K/100K,所以应该很快就完成了)
- CPU 保持在 45% 左右的强势
- 已用堆大约为 2GB(在 GC 后加上或减去一堆),但在大约 30 分钟后堆大小从 4GB 增加到
MAX_HEAP
- 类加载/卸载正常循环
- 线程转储正常
服务器代码中没有对 System.exit()
的任何调用 - 因此我们可以立即排除这种情况(是的,我已经仔细检查过!!!)。
我不确定这是 Tomcat 崩溃还是 JVM(我怎么知道?)。即使我确实知道,我似乎也找不到任何问题的迹象:
- 所有服务器应用程序的日志都没有任何错误消息就停止了(即使我们将日志记录普遍设置为 DEBUG 或更高级别)
- Tomcat 的
catalina.out
和 respectlocalhost_access_*
文件在没有任何信息的情况下停止
我听说可以让 Tomcat 在记录核心转储时记录它,但不确定如何做到这一点,在线示例也没有太大帮助。
SO 将如何进行诊断?我应该采取什么步骤来开始排除所有可能的因素?
提前致谢!
最佳答案
如果 JVM 崩溃,你应该有一个 hs_err_pidNNN.log 文件;您无需执行任何操作即可启用此功能。它的位置取决于您的操作系统以及您运行 Tomcat 的方式。在 Windows 上,它们可以显示在您的桌面上,除非您作为服务运行。否则,它们应该位于崩溃进程的当前工作目录中。
您的操作系统可能提供了额外的进程监控工具;你可以更多地描述你的环境,或者问serverfault.com .
也有可能 jvisualvm
实际上导致了崩溃。
我会尝试重现问题,并逐步简化场景以帮助找出原因。
关于java - Tomcat突然死了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132496/