我的tomcat(Apache Tomcat / 6.0.18)似乎有内存泄漏。
初步分析
在多个服务器上的某一时刻,堆利用率超过了90%。然后,我进行了堆转储及其分析,它指出了两个可能的泄漏:
由“”加载的4550个“ char []”实例占用321358144(42.39%)个字节。
最大的实例:
字符[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 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u00 ...-10204016( 1,35%)字节。
由“ org.apache.catalina.loader.StandardClassLoader @ 0xbb003c30”加载的392个“ org.apache.tomcat.util.threads.ThreadWithAttributes”实例占据了151940704(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中不占用太多空间的方法?
最佳答案
尝试禁用JspWriterImpl池,在JRE启动命令上添加以下参数:
-Dorg.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true
使用后将释放JspWriterImpl缓冲区