Tomcat 或 Java 中是否存在像 beforeCrash() 或 beforeExit() 这样的函数

Does any function like beforeCrash() or beforeExit() exist in Tomcat or Java

我有 tomcat 服务器 运行。由于某种原因它突然崩溃了...但是我正在尝试查找错误。

tomcat 或 java 中是否有类似 beforeExit()ifCrashed() 的功能,我可以覆盖并在那里编写一些代码,例如在服务器因某些原因崩溃时通知自己原因。

我认为崩溃的服务器无法解决问题。您可以考虑以下步骤:

  • 使用 servletContextListeners 以便 运行 在 servlet 上下文关闭之前编写代码。如果关机正常完成,它将起作用
  • 如果是 JVM 压垮你可以尝试寻找提供 JVM 监控服务和报告的工具。我还建议提供标志以便从 OutOfMemoryError 获取报告并打开 JMX 端口进行监控
  • 你可以纠正一些模拟休息端点和 运行 一些会定期调用该端点的外部作业,如果它 returns HTTPStatus.OK 那么它就可以工作,如果没有 - 那么你可以以某种方式报告自己。

如果您能提供日志和一些关于服务器实际情况的信息,那可能会更好。也许这里的人会提供帮助,但我想这是另一个问题的主题。

如果发生致命崩溃,您将获得 jvm 日志。您可以通过在 Oracle JVM

上给 tomcat 一个 -XX:ErrorFile 来指定位置

http://www.oracle.com/technetwork/java/javase/felog-138657.html

如果不是那么致命,您可以调整 tomcat 中的日志设置以显示更好的日志记录级别,例如在其文档站点上指定的

https://tomcat.apache.org/tomcat-6.0-doc/logging.html

如果它因为内存不足错误而死,你可以在 OOM 上获取堆转储,并用 jhat 分析它

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html

您可以尝试使用在系统退出时执行的关闭挂钩。虽然不能保证它会在像 SIGKILL 这样的硬崩溃时执行,但在某些情况下这可能是一个选项:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // Implementation goes here..;
    }
});

如果分析是您的一个选项,JProfiler 有一个离线分析模式,您可以在其中捕获有关 运行 程序的信息并将其记录下来以供以后查看。查看文档 JPRofiler Offline Profiling

这可能会让您更深入地了解应用程序中发生的事情。根据此文档,您还可以从您的应用程序管理分析代理。