我有一个在Tomcat 7上运行的Java Web应用程序,它似乎有内存泄漏。当负载不足(使用JConsole确定)时,应用程序的平均内存使用量随时间线性增加。内存使用量达到高原后,性能显着下降。响应时间从〜100ms到[300ms,2500ms],所以这实际上导致了真正的问题。Java Web应用程序中的内存泄漏
我的申请的JConsole的存储器配置文件:
使用的VisualVM,我看到至少有一半的存储器正在使用的字符阵列(即炭[])和大部分(大致相同数量的每个300,000个实例)是以下之一:“分配失败”,“复制”,“小GC的结束”,所有这些似乎都与垃圾回收通知有关。据我所知,应用程序根本不监视垃圾收集器。 VisualVM找不到任何这些字符串的GC根目录,所以我很难跟踪它。
内存分析器堆转储:
我无法解释为什么内存使用情况高原这样,但我有一个理论,为什么性能会下降,一旦它。如果内存碎片化,应用程序可能需要很长时间才能分配连续的内存块来处理新的请求。
将它与内置的Tomcat服务器状态应用程序进行比较后,内存会增加并停止运行,但不会像我的应用程序那样达到高“楼层”。它也没有大量的不可达char []。
Tomcat服务器身份申请JConsole的内存配置文件:
Tomcat服务器状态applicationp的内存分析器堆转储:
如果可以将这些字符串分配他们为什么不被垃圾收集?有没有可能影响到这个的Tomcat或Java设置?是否有特定的软件包可能会影响到这一点?
你是如何确定这些字符串没有被特殊处理的? – djechlin
当我的应用程序空闲时,我强制垃圾收集并使用VisualVM进行堆转储。这些字符串的数量总是随着时间的推移而增加,并且总是占已用内存的至少一半。 –
内存分析器指出不可访问的char []和String对象占据了176MB的210MB堆。 –