StringBuffer char []似乎超出了heapdump的范围

时间:2014-02-27 11:28:24

标签: java arrays memory-leaks stringbuffer ibm-jvm

在OutOfMemoryError之后,我通过IBM Support Assistant的64位内存分析器(在Websphere 7.0.23上运行的J9 VM)处理了生成的堆转储

列出了几个泄漏候选者(所有系统类加载器相关)但是其中一个似乎表明在StringBuffer中初始化值为256的char []实际上包含7700万个空字符。

来自Support Assistant的结果堆转换分析显示char [77418987] @ 0xc32 * * * \ u0000 \ u0000 \ u0000 .......

这是由StringBuffer引用的 - > PatternLayout - > TimeAndSizeRollingAppender

保留堆检出,每个char有2个字节,数组本身有18个,总共150+ Mbs。

Log4j版本是1.2.16,我们使用simonsite TimeAndSizeRollingAppender(虽然我想删除这种依赖)。

这可能是支持助手的误报,还是有些方法可以使char [256]成为堆上的[77000000+]?

1 个答案:

答案 0 :(得分:1)

默认情况下,WebSphere会生成一个PHD文件以响应OOM事件。您需要注意的一件事是,这些转储包含有关堆中对象及其引用的信息,但不包含存储在属性和数组(原始类型)中的实际数据。这就是内存分析器只显示零的原因。要获取有关根本原因的更多信息,您应该配置WebSphere以创建系统转储。这将允许您查看数组中的数据,并应该提供有关正在发生的事情的提示。

以下链接说明了如何执行此操作:

http://pic.dhe.ibm.com/infocenter/isa/v4r1m0/topic/com.ibm.java.diagnostics.memory.analyzer.doc/producing.html

对于256 vs. 77000000+问题:256只是StringBuffer的初始容量。当附加数据时,它会根据需要自动增长。