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

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

我无法解释为什么内存使用量会如此高,但我有一个关于为什么性能一旦降低就会降低的理论.如果内存碎片化,应用程序可能需要很长时间才能分配连续的内存块来处理新请求.
将其与内置的Tomcat服务器状态应用程序进行比较,内存会增加并保持稳定,但不会像我的应用程序那样达到很高的"底限".它也没有大量无法访问的char [].
Tomcat服务器状态应用程序的JConsole内存配置文件:

Tomcat服务器状态applicationp的内存分析器堆转储:

这些字符串可以在哪里分配,为什么它们不被垃圾收集?是否存在可能影响此问题的Tomcat或Java设置?是否有特定的包可能会影响这个?
我从以下位置删除了以下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小时后,内存配置文件看起来一样:

| 归档时间: |
|
| 查看次数: |
29557 次 |
| 最近记录: |