我有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。
支配树分析表明,主要罪魁祸首是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的空间?
答案 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(免费,开源))为您扫描代码。