【问题标题】:StringBuffer char[] appears to be out of bounds in heapdumpStringBuffer char[] 在 heapdump 中似乎超出范围
【发布时间】: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 的任何错误 - 您可以链接到相关代码吗?
  • 已编辑。屏幕截图在这里s1026.photobucket.com/user/Spinflight/media/…
  • 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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢安德烈亚斯,这解释了空值。至于问题本身,恐怕完全误解了常用的StringBuffer类和它的作用。
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 2010-10-25
  • 2023-03-27
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
相关资源
最近更新 更多