处理服务器内的错误(例如OutOfMemoryError)

时间:2009-09-24 10:24:34

标签: java tomcat error-handling

在服务器应用程序中处理错误时,最佳做法是什么?

特别是,您认为应用程序应如何处理OutOfMemoryError等错误?

我对在Tomcat中运行的Java应用程序特别感兴趣,但我认为这是一个更普遍的问题。


我问的原因是因为我正在审查经常抛出OOME的Web应用程序,但通常它只是记录它们然后继续执行。显然,这会导致更多的OOME。

虽然这当然是不好的做法,但在我看来,我并不完全确定停止服务器是最佳解决方案。

9 个答案:

答案 0 :(得分:2)

除了清理代码和调整JVM内存之外,你无法修复OutOfMemoryError(但如果你在某个地方有泄漏它只是一个绑定)

如果您无法访问源代码和/或不愿意修复它,外部解决方案是使用某种监视程序,监视Java应用程序并在检测到OOME时自动重新启动它。这是一个program的链接。

当然,它假定应用程序将在重新启动后继续存在。

答案 1 :(得分:2)

应用程序根本不应该处理OOM - 这应该是服务器的责任。

下一步:检查内存设置是否合适。如果不是,请修理它们;如果是,请修复应用程序。 :)

答案 2 :(得分:1)

好吧,如果你有OOME,那么最好的方法就是尽可能多地释放资源(特别是缓存的资源)。重新启动web-app(如果它是web-apps错误)或web服务器本身(如果服务器中的其他内容执行此操作)将从此状态恢复。在开发方面,尽管分析应用程序并查看占用空间的内容是好的,但有时会有附加到类变量的资源,因此不会收集,有时会收集其他内容。在过去,我们遇到的问题是,当您使用较新版本替换应用程序时,Tomcat不会发布同一应用程序的先前版本的类。通过使类变量无效或重新分解根本不使用它们来解决问题,但仍然存在一些泄漏。

答案 3 :(得分:1)

OutOfMemoryError并不总是不可恢复的 - 它可能是单个错误请求的结果,并且根据应用程序的结构,它可能会放弃处理请求并继续处理其他请求而没有任何问题。< / p>

因此,如果您的架构支持它,请在您有机会停止执行导致错误的位置捕获错误并继续执行其他操作 - 对于应用服务器,这将是将请求分派给单个应用程序的点实例

当然,您还应该确保不会忽视这一点并且可以尽快实现真正的修复,因此应用程序应该记录错误并发出某种警告(例如电子邮件,但最好是某些东西)更难忽视或迷路)。如果在此期间出现问题,然后关闭是唯一明智的做法。

答案 4 :(得分:1)

@Michael Borgwardt,您无法从Java中的 OutOfMemoryError 中恢复。对于其他错误,它可能不会停止应用程序,但 OutOfMemoryError 会直接挂起应用程序。

答案 5 :(得分:1)

在我们严重处理文档的应用程序中,我们确实捕获了OOM错误,其中一个错误的请求可能导致OOM,但我们不想因此而关闭应用程序。我们捕获OOM并记录它。 不确定这是否是最佳做法,但似乎正在运作

答案 6 :(得分:0)

我不是这方面的专家,但我会抓住机会对这个问题发表含糊的看法。

一般来说,我认为有两种主要方式:

  1. 服务器已停止。
  2. 资源因此优雅地降低了吞吐量,减少了内存消耗,但保持活力。对于这种情况,我认为应用程序必须具有适当的体系结构。

答案 7 :(得分:0)

根据关于java.lang.Error的javadoc:

  

ErrorThrowable的子类,表示合理的应用程序不应该试图捕获的严重问题。大多数此类错误都是异常情况。 ThreadDeath错误虽然是“正常”条件,但也是Error的子类,因为大多数应用程序都不应该尝试捕获它。

     

不需要方法在其throws子句中声明在执行方法期间可能抛出但未捕获的Error的任何子类,因为这些错误是不应发生的异常情况。

因此,处理Error的子类时的最佳做法是解决导致它们的问题,而不是“处理”它们。正如它明确指出的那样,它们永远不会发生

对于OutOfMemoryError,您可能有一个消耗大量内存的进程(例如生成报告),并且您的JVM大小不合适,可能是您的应用程序中某处存在内存泄漏等。无论是什么,找到问题并修复它,不要处理它。

答案 8 :(得分:0)

我强烈不同意你永远不应该处理OutOfMemoryError的想法。

是的,大多数时候它往往是不可恢复的。但是,我的一台服务器在几天前收到了一台服务器,服务器仍然工作了一个半小时以上。没有人抱怨所以直到我的监控软件出现故障并且在第一个OutOfMemoryError之后一个半小时我没有注意到。当我的服务器上出现OutOfMemoryError时,我需要尽快知道。我需要处理它,以便我可以设置通知,以便我知道尽快重启我的服务器。

我还在试图弄清楚如何让Tomcat在遇到错误时做点什么。错误页面似乎不起作用。