错误记录和分析 Web 应用程序

Error logging and profiling a web application

我已经在 windows7 机器上使用 tomcat7 部署了两个 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

I want to know which application first throws error, so I want tomcat logs the error with the Application name, Is it possible to do?

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

那是因为您看到了 OOME:PermGen 有几个可能的原因。

  • 您有很多(数千)个 JSP。这些被编译为 类 并且 类 增加了 PermGen 要求。这是一个合法的用例,如果你有很多 JSP,你只需要一个更大的 PermGen。
  • 您有一个动态生成 类 的应用程序。像 cglib 这样的库可以做到这一点。您可能不会直接使用它,但是很多框架都在使用它或类似的库。同样,我建议增加 PermGen,因为您可能只需要更多 运行 应用程序。
  • 您正在热重新部署应用程序(您将新的 WAR 放入 "webapps" 目录而无需重新启动)。这本身不是问题,但如果您的应用程序没有完全取消部署,您最终会遇到缓慢的内存泄漏,这将导致您 运行 退出 PermGen space。如果您遇到此问题,请查看 these slides,尤其是 #11,其中更多地讨论了该问题并展示了如何找出原因。

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

Can I check which web application is taking how much memory from memory allocated to tomcat 7?

附加分析器或 jvisualvm。他们中的大多数人对 PermGen 没有很好的了解,因为他们通常关注堆的使用,但他们会提供帮助。

如果您使用的是 jvisualvm,这些是一些用于调试内存相关问题的有用插件:"Memory Pools"、"Visual GC" 和 "VisualVM-BufferMonitor"。

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

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

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

after sometime of use any one of application throws java.lang.OutOfMemoryError: PermGen space error. after 2-3 mins another application also stops to respond.

当JVM出现OOME时,需要尽快重启JVM。在 OOME 发生后,关于什么会继续工作和什么不会继续工作的所有赌注都落空了。恢复正常工作环境的唯一方法是重新启动 JVM。