在 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+]?