0

在 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 引用的

保留的堆签出,每个字符 2 个字节,数组本身 18 个字节,总共 150+ Mbs。

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

这可能是支持助手的误报,还是有某种方式可以使 char[256] 在堆上变成 char[77000000+]?

4

1 回答 1

1

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

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

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

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

于 2014-02-28T08:39:22.187 回答