记录和分析Web应用程序时出错

时间:2015-02-27 08:22:08

标签: tomcat

我在tomcat7计算机上部署了两个windows7的Web应用程序。经过一段时间的使用后,任何一个应用程序都会抛出java.lang.OutOfMemoryError: PermGen space错误。 2-3分钟后,另一个应用程序也停止响应。所以我开始查看tomcat7错误日志文件tomcat7-stderr.xxx.log,我发现日志说某些http-bio线程抛出了内存不足错误。

我想知道哪个应用程序抛出第一个错误,所以我希望tomcat使用错误记录应用程序名称,我该怎么做?

我可以检查每个Web应用程序从分配给tomcat的内存中获取多少内存吗?

目前tomcat有Initial Memory Pool is 512 MBMaximum memory pool is 900 MB

1 个答案:

答案 0 :(得分:3)

  

我想知道哪个应用程序首先抛出错误,所以我希望tomcat使用Application名称记录错误,是否可以这样做?

Tomcat和您部署到Tomcat的所有应用程序都在一个 JVM中运行。这意味着这些应用程序中的任何一个都可能是原因,但这也意味着它可能是导致问题的一个或多个应用程序的聚合。换句话说,您可能无法仅指一个应用程序。

那说是因为你看到了OOME:PermGen有一些可能的原因。

  • 你有很多(数千)JSP。这些被编译为类和类增加了PermGen的要求。这是一个合法的用例,如果你有很多JSP,你只需要一个更大的PermGen。
  • 您有一个动态生成类的应用程序。像cglib这样的库可以做到这一点。您可能没有直接使用它,但许多框架使用它或类似的库。同样,我建议增加PermGen,因为您可能只需要更多一点来运行应用程序。
  • 您正在热重新部署应用程序(将新WAR放入“webapps”目录而不重新启动)。这本身并不是问题,但是如果你的应用程序没有干净地取消部署,你最终会导致内存泄漏,导致你的PermGen空间不足。如果你看到这个问题,请查看these slides,特别是#11,它会更多地讨论这个问题,并说明如何找出原因。

在这三个中,最后一个是最有可能发生的。

  

我可以检查哪个Web应用程序正在从分配给tomcat 7的内存中获取多少内存?

附加探查器或jvisualvm。他们中的大多数人对PermGen没有很好的可见性,因为他们通常关注堆使用,但他们会帮助。

如果您正在使用jvisualvm,这些是一些有用的插件,用于调试与内存相关的问题:“内存池”,“Visual GC”和“VisualVM-BufferMonitor”。

默认情况下不会安装它们,因此您必须转到工具 - >插件并安装它们。

无论您使用什么工具,我都怀疑您是否会找到按应用程序划分内存使用量的细分。 “应用程序”是容器级概念,而不是JVM或您的探查器可能理解的概念。如果您需要隔离每个应用程序的内存使用情况,那么最好一次只将一个应用程序部署到Tomcat。这样你知道内存中唯一的东西就是与该应用程序相关的资源。

如果您处于生产环境中,您可能需要考虑运行多个单独的Tomcat实例(每个应用程序一个)。这样做的结果是,每个应用程序都有单独的JVM,如果一个应用程序出现故障,它将不会使用其余的JVM。缺点是额外的JVM和Tomcat实例会有一些开销。如果你有可用的内存,那么它提供的额外稳定性通常是可以接受的权衡。

  

在使用一段时间之后,任何一个应用程序抛出java.lang.OutOfMemoryError:PermGen空间错误。 2-3分钟后,另一个应用程序也停止响应。

当在JVM中发生OOME时,您需要尽快重启JVM。在OOME发生之后,所有的赌注都将取决于将要继续工作的内容和内容。恢复理智的工作环境的唯一方法是重新启动JVM。