java.lang.OutOfMemoryError:PermGen空间错误,Tomcat或PHP-Java Bridge可能存在内存泄漏?

时间:2013-08-27 18:31:44

标签: java tomcat memory-leaks permgen php-java-bridge

  • 操作系统:Windows Server 2008 R2 SP1
  • Web服务器:IIS 7.5
  • JSP / Servlet引擎:Tomcat 5.5.28(32位)
  • PHP:5.4.14
  • Java:JRE SE 1.6.0_20(32位)
  • Apache Isapi Connector从IIS挂钩到Tomcat
  • PHP-Java Bridge 6.2.1
  • BMC AR System 7.5 Patch 6
  • Tomcat初始和最大内存:1024 MB,1024 MB

我正在使用名为AR System的Java Web应用程序。安装PHP-Java Bridge之后,我开始在Tomcat日志中看到 java.lang.OutOfMemoryError:PermGen space error 。 (我在Windows任务管理器中看到有6个PHP-CGI.exe进程,所有内存占用类似,给出或占用5 MB)。它会每隔一天发生一次,然后缩短到每天,有时每天两次。因此,应用程序挂起,我必须重新启动它。我在非高峰时段添加了一个Windows任务来重启Tomcat给我一些缓冲。我怀疑是内存泄漏并开始做一些研究。通常,Tomcat的大小约为300-350 MB。使用PHP-Java Bridge,内存大幅增加。实际上,错误发生在450-600 MB之间。

我了解到默认的PermGen是64MB,PermGen应该设置为1/4,最多为Tomcat内存的1/3(抱歉,我不记得链接)。此时Tomcat正在Windows服务下运行,我在其属性中添加了以下内容:

  • -XX:+ UseConcMarkSweepGC
  • -XX:+ CMSPermGenSweepingEnabled
  • -XX:+ CMSClassUnloadingEnabled
  • -XX:PermSize = 128M
  • -XX:MaxPermSize参数= 256M

我在PermGen内存上强制执行GC,并将大小从默认的64 MB大小增加到128-256 MB。内存一直缓慢上升到800-850 MB,但在高峰时段它并没有挂起,尽管我仍然通过Windows任务在非高峰时段故意重启Tomcat。如果我取消重启, MIGHT 最终会挂起但我还没试过。

我仍怀疑内存泄漏。我安装了AppDynamics的试用版来监控应用程序,内存和运行泄漏检测。此外,为了使用VisualVM和Memory Analyzer(MAT)等工具,我禁用了Tomcat Windows服务,并通过catalina.bat从Windows命令行运行Tomcat。我将Java选项附加到文件中;我确保Tomcat内存为1024 MB,Perm Gen为128/256 MB,并确保PHP-Java Bridge和AppDynamics正在运行。截至目前,PermGen使用的是163 MB,AppDynamic的自动泄漏检测未检测到任何Java Collections的任何泄漏。

我启动了MAT,创建了一个堆转储并分析了泄漏。当我昨天运行它时,发现了三个可能的嫌疑人:

  • net.sf.ehcache.Cache
  • net.sf.ehcache.store.DiskStore
  • org.apache.catalina.loader.WebappClassLoader

今天我跑的时候发现了两个可能的嫌疑人:

  • 的java.util.HashMap
  • org.apache.jasper.servlet.JasperLoader

因此,使用MAT和AppDynamics,似乎没有检测到与PHP-Java Bridge JAR文件直接相关的类的内存泄漏。我没有尝试过使用Plumbr,但是我无法找到免费测试版。免费版本检测泄漏,但您必须付费才能看到它。

此外,我目前还没有源链接,但我记得读过Tomcat 5.x 可以有性能和内存泄漏问题。当然,这并不意味着每个人都会有这些问题,只是一个选择的数字。我知道Tomcat 6和Tomcat 7重新设计了他们的内存管理或者他们如何构建内存。我也与来自AR System的制造商BMC的人进行了交谈,他们说当前版本的AR System I使用可能会遇到性能和内存问题。但是,在PHP-Java Bridge之前,这一切都不是问题。只有在我安装它之后,这个PermGen内存问题才开始。

由于上述工具没有报告任何泄漏,这是否意味着没有泄漏,PHP-Java Bridge只需要64 MB以上的PermGen内存?或者,我的Tomcat版本是否存在继承问题,安装PHP-Java Bridge只是打破了众所周知的骆驼?

升级到较新版本的AR System和Tomcat不是一种选择。如果有泄漏,我可以卸载PHP-Java Bridge或继续尝试查找泄漏并修复它。

任何帮助都将不胜感激。

谢谢。

更新1

使用MAT,我查看了线程概述和堆栈,您可以在下面看到PHP-Java Bridge占Tomcat总堆内存的2/3。那记忆力很大!我觉得有泄漏,我知道。我无法找到有关继承内存泄漏问题的PHP-Java Bridge的任何信息。但是,对我来说,问题似乎不是Tomcat泄漏。想法?

MAT Thread Stack of Tomcat heap

AppDynamics无法发现任何泄漏,即使我手动添加MAT中怀疑的类。我想知道的可能是PermGen错误是这种情况的一个症状,程序没有泄漏,需要分配更多的PermGen内存。知道PHP-Java Bridge是否设计用于占用大量内存,这将是很有用的内存;也许它已针对64位进行了优化,因为当前的设置是32位Java Web应用程序。如果我知道这座桥需要大量的记忆,我会说好的,很好,并从那里开始。但它看起来似乎在链中某处存在内存泄漏。

更新2

我现在已经跑了Plumbr 2小时差不多10分钟。我看到Tomcat的内存高达960 MB,可能会继续攀升。对于那些熟悉该程序的人,已经对Java Web应用程序进行了3次分析。到目前为止,没有泄漏报告。如果它保持这种状态,那么我得出的两个结论是:a)没有泄漏或b)存在泄漏,并且不知何故,AppDynamics和Plumbr都错过了它。如果这组应用程序一起工作确实没有泄漏,那么必须是Bridge使用大量内存并且需要比Tomcat的默认值更多的PermGen内存,64 MB - 至少32 -bit Java Web应用程序。

0 个答案:

没有答案