我已在 windows7
计算机上使用 tomcat7
部署了两个 Web 应用程序。使用一段时间后,任何一个应用程序都会抛出 java.lang.OutOfMemoryError: PermGen space
错误。 2-3 分钟后,另一个应用程序也停止响应。因此,我开始查看 tomcat7 错误日志文件 tomcat7-stderr.xxx.log
,我发现日志显示某些 http-bio
线程引发了内存不足错误。
我想知道哪个应用程序抛出第一个错误,所以我希望 tomcat 记录带有错误的应用程序名称,我该怎么做?
我可以检查每个 Web 应用程序从分配给 tomcat 的内存中占用了多少内存吗?
目前 tomcat 的初始内存池为 512 MB
,最大内存池为 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 的所有应用程序都在一个 JVM 中运行。这意味着这些应用程序中的任何一个都可能是原因,但也意味着它也可能是导致问题的一个或多个应用程序的集合。换句话说,您可能无法只对一个应用程序指手画脚。
这就是说,因为您看到的是 OOME:PermGen,有几个可能的原因。
- 您有很多(数千个)JSP。这些被编译为类,并且类增加了 PermGen 要求。这是一个合法的用例,如果您有大量 JSP,则只需要更大的 PermGen。
- 您有一个动态生成类的应用程序。像 cglib 这样的库可以做到这一点。您可能没有直接使用它,但许多框架都使用它或类似的库。再次,我建议增加 PermGen,因为您可能只需要多一点来运行应用程序。
- 您正在热重新部署应用程序(无需重新启动即可将新的 WAR 放入“webapps”目录中)。这本身并不是问题,但如果您的应用程序没有完全取消部署,您最终会出现缓慢的内存泄漏,从而导致 PermGen 空间耗尽。如果您遇到此问题,请查看 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”。
默认情况下它们不会安装,因此您必须转到“工具”->“插件”并安装它们。
无论您使用什么工具,我怀疑您都会找到按应用程序划分内存使用情况的分割。 “应用程序”是一种容器级别的概念,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。
关于tomcat - 错误记录和分析 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760411/