【发布时间】:2014-03-30 19:12:20
【问题描述】:
在发生 OutOfMemoryError 之后,我通过 IBM Support Assistant 的 64 位内存分析器(在 Websphere 7.0.23 上运行的 J9 VM)处理了生成的堆转储
列出了几个泄漏候选者(所有与系统类加载器相关),但其中一个似乎表明在 StringBuffer 中初始化为 256 的 char[] 实际上包含 7700 万个空字符。
支持助手生成的堆转储分析显示 char[77418987] @ 0xc32*** \u0000\u0000\u0000.......
这是由 StringBuffer -> PatternLayout -> TimeAndSizeRollingAppender 引用的
保留的堆检出,每个字符 2 个字节,数组本身 18 个字节,总共 150+ Mbs。
Log4j 版本是 1.2.16,我们使用 simonsite TimeAndSizeRollingAppender(虽然我想删除这个依赖)。
这可能是来自 Support Assistant 的误报,还是有某种方式可以让 char[256] 在堆上变成 char[77000000+]?
【问题讨论】:
-
“实际上包含 7700 万个空对象”——不,它包含 7700 万个 U+0000 个字符。没有“空对象”这样的东西。在您使用术语时要精确。这听起来像是创建
StringBuffer的任何错误 - 您可以链接到相关代码吗? -
StringBuffer 似乎是由 log4j PatternLayout.java 创建的。
-
'code' this.BUF_SIZE = 256; /* 410 /this.MAX_CAPACITY = 1024; / / / 414 */ this.sbuf = new StringBuffer(256); '代码'
-
那么
StringBuffer附加在第 506 行:c.format(sbuf, event);。你有完整的堆栈跟踪吗?也许您正在尝试记录一些巨大的?
标签: java arrays memory-leaks stringbuffer ibm-jvm