Java Web应用程序中的内存泄漏

Kev*_*ler 20 java tomcat web

我有一个在Tomcat 7上运行的Java Web应用程序似乎有内存泄漏.应用程序的平均内存使用量在负载下随着时间线性增加(使用JConsole确定).在内存使用率达到稳定水平后,性能会显着下降.响应时间从~100ms到[300ms,2500ms],所以这实际上是造成实际问题.

我的应用程序的JConsole内存配置文件: 应用程序内存配置

使用VisualVM,我看到至少有一半的内存被字符数组(即char [])使用,并且字符串的大多数(大致相同数量的每个,300,000个实例)是以下之一:"分配失败" ,"复制","次要GC的结束",所有这些似乎都与垃圾收集通知有关.据我所知,应用程序根本不监视垃圾收集器.VisualVM找不到任何这些字符串的GC根,所以我很难跟踪它.

内存分析器堆转储: 堆转储,无法访问的内存

我无法解释为什么内存使用量会如此高,但我有一个关于为什么性能一旦降低就会降低的理论.如果内存碎片化,应用程序可能需要很长时间才能分配连续的内存块来处理新请求.

将其与内置的Tomcat服务器状态应用程序进行比较,内存会增加并保持稳定,但不会像我的应用程序那样达到很高的"底限".它也没有大量无法访问的char [].

Tomcat服务器状态应用程序的JConsole内存配置文件: 在此输入图像描述

Tomcat服务器状态applicationp的内存分析器堆转储: 在此输入图像描述

这些字符串可以在哪里分配,为什么它们不被垃圾收集?是否存在可能影响此问题的Tomcat或Java设置?是否有特定的包可能会影响这个?

Kev*_*ler 7

我从以下位置删除了以下JMX配置tomcat\bin\setenv.bat:

set "JAVA_OPTS=%JAVA_OPTS% 
    -Dcom.sun.management.jmxremote=true 
    -Dcom.sun.management.jmxremote.port=9090
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false"
Run Code Online (Sandbox Code Playgroud)

我不能再获得详细的内存堆转储,但内存配置文件看起来要好得多: 在此输入图像描述

24小时后,内存配置文件看起来一样: 在此输入图像描述