我在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 MB
和Maximum memory pool is 900 MB
答案 0 :(得分:3)
我想知道哪个应用程序首先抛出错误,所以我希望tomcat使用Application名称记录错误,是否可以这样做?
Tomcat和您部署到Tomcat的所有应用程序都在一个 JVM中运行。这意味着这些应用程序中的任何一个都可能是原因,但这也意味着它可能是导致问题的一个或多个应用程序的聚合。换句话说,您可能无法仅指一个应用程序。
那说是因为你看到了OOME:PermGen有一些可能的原因。
在这三个中,最后一个是最有可能发生的。
我可以检查哪个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。