Tomcat,内存泄漏char []和ThreadWithAttributes

时间:2013-10-18 10:59:10

标签: java tomcat memory-leaks tomcat6

我有tomcat(Apache Tomcat / 6.0.18)似乎有内存泄漏。

初步分析

在多台服务器上的某一点上,堆利用率超过了90%。然后我做了一个堆转储及其分析,指出了两个可能的泄漏:

  

“char []”的4 550个实例,由“”加载占用321 358 144(42,39%)个字节。

     

最大的实例:

     

char [5102000] @ 0xd18668c8 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u00 ... - 10 204 016(1,35%)字节。


  

“org.apache.tomcat.util.threads.ThreadWithAttributes”的392个实例,由“org.apache.catalina.loader.StandardClassLoader @ 0xbb003c30”加载,占用151 940 704(20,04%)个字节。

其中char [5102000]重复多次并填充为null。

分析

org.apache.tomcat.util.threads.ThreadWithAttributes

支配树分析表明,主要罪魁祸首是CA Wily Introscope。

╔═══════════════════════════════════════════════════════════════════════════════════════╦════════════════════════╦═════════════════╦═════════════════╦═════════════╗
║   Class Name                                                                          ║        Objects         ║  Shallow Heap   ║  Retained Heap  ║  Percentage ║
╠═══════════════════════════════════════════════════════════════════════════════════════╬════════════════════════╬═════════════════╬═════════════════╬═════════════╣
║ org.apache.tomcat.util.threads.ThreadWithAttributes                                   ║ 392                    ║        53 312   ║    151 940 704  ║ 20,04%      ║
║ #-java.lang.ThreadLocal$ThreadLocalMap$Entry                                          ║  254 047               ║     8 129 504   ║    146 384 296  ║ 19,31%      ║
║ ##- com.wily.util.adt.CanonicalObjectPoolWithKey                                      ║ 391                    ║        12 512   ║     72 506 184  ║ 9,56%       ║
║ ##- java.util.HashMap                                                                 ║  199 734               ║     7 989 360   ║     40 377 784  ║ 5,33%       ║
║ ###- com.wily.util.adt.WeakWeakIdentityHashMap                                        ║ 391                    ║         9 384   ║     11 503 344  ║ 1,52%       ║
║ #java.util.HashMap$Entry                                                              ║  207 683 #  4 984 392  ║     16 396 456  ║ 2,16%           ║             ║
║ ####- com.wily.introscope.agent.trace.BlamePointTracer$DataAccumulatorGroup           ║   49 807               ║     1 593 824   ║      1 593 824  ║ 0,21%       ║
║ ####- com.wily.introscope.agent.trace.servlet.ServletObjectFactory$MethodKey          ║    2 563               ║        61 512   ║         62 840  ║ 0,01%       ║
║ #####- com.wily.introscope.stat.gatherer.IntegerAverageGatherer                       ║ 92                     ║         5 152   ║         10 304  ║ 0,00%       ║
║ #####- com.wily.introscope.stat.gatherer.IntervalCounterGatherer                      ║ 109                    ║         4 360   ║          4 360  ║ 0,00%       ║
║ #####- com.wily.introscope.stat.gatherer.IntegerFluctuatingCounterGatherer            ║ 55                     ║         3 080   ║          3 080  ║ 0,00%       ║
║ #####- com.wily.introscope.stat.gatherer.IntegerAggregatingFluctuatingCounterGatherer ║ 54                     ║         3 024   ║          3 024  ║ 0,00%       ║
╚═══════════════════════════════════════════════════════════════════════════════════════╩════════════════════════╩═════════════════╩═════════════════╩═════════════╝

炭[]

支配树分析没有显示任何内容 - 唯一的积累点是char []。分析“合并到GC根的最短路径”直接指向org.apache.tomcat.util.threads.ThreadWithAttributes。

╔══════════════════════════════════════════════════════════════════════════════════════════╦════════════════╦════════════════╦═════════════════════╦════════════════╗
║                                        Class Name                                        ║  Ref. Objects  ║  Shallow Heap  ║  Ref. Shallow Heap  ║  Retained Heap ║
╠══════════════════════════════════════════════════════════════════════════════════════════╬════════════════╬════════════════╬═════════════════════╬════════════════╣
║ org.apache.tomcat.util.threads.ThreadWithAttributes @ 0xd0b12cb8  TP-Processor203 Thread ║              1 ║ 136            ║         10 204 016  ║        240 216 ║
║ - <Java Local> char[5102000] @ 0xd18668c8  \u0000\u0000...                               ║              1 ║    10 204 016  ║         10 204 016  ║     10 204 016 ║
╚══════════════════════════════════════════════════════════════════════════════════════════╩════════════════╩════════════════╩═════════════════════╩════════════════╝

问题

什么负责创建多个填充null的对象char []?如何补救不占用hea的空间?

2 个答案:

答案 0 :(得分:1)

尝试禁用JspWriterImpl Pool,在JRE启动命令中添加此参数:

-Dorg.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true

这将在使用

后释放JspWriterImpl缓冲区

答案 1 :(得分:-1)

由于您提供的信息很少,很难说出问题所在。另外TomCat众所周知既不稳定也不无错误,所以漏洞也可能出现在TomCat本身。

如果您无法手动找到问题,可以使用静态代码分析工具(如FindBugs(免费,开源))为您扫描代码。