开发者社区 问答 正文

SAX,StringBuilder和内存泄漏

我有一个奇怪的问题。我正在解析具有大文本字段的文档。在我的角色部分中,我正在使用StringBuilder

currentStory.append(ch, start, length); 然后在endElement中,将其分配给对象上的相应字段。

  if (name.equals(tagDesc)) {
     inDesc = false;
     if (currentItem != null ) {
         currentItem.setSummaryText(currentStory.toString());
     }
     currentStory.setLength(0);
  }
setSummaryText(String text) 方法是:

    public void setSummaryText(String text) {
      Story = text;
    }

而且我的内存不足。

如果我将setSummaryText更改为完全像这样的东西


public void setSummaryText(String text) {
      char[] local = text.toString()
      Story = new String(local);
   }

我很好。我只是不知道该引用在哪里保存?Story是此对象的成员变量,以“”初始化;注意-分配给本地String变量而不是char []-也会失败。

展开
收起
Puppet 2020-01-24 14:02:44 863 分享 版权
1 条回答
写回答
取消 提交回答
  • 我认为这可能与方法的性能优化有关StringBuffer toString()。

    Sun Javadoc表示以下内容:

    可以对该方法进行编码,以便创建新的String对象,而无需分配新的内存来保存字符序列的副本。而是,字符串可以共享字符串缓冲区使用的内存。然后,任何随后更改字符串缓冲区的内容或容量的操作都必须在那时复制内部缓冲区。当使用字符串缓冲区实现该策略时,该策略可有效减少由字符串串联操作分配的内存量。

    因为您要重新使用StringBufferwith,setLength(0)所以它可能会保留对其创建的所有String的引用toString()。

    更换:

    currentStory.setLength(0); 与:

    currentStory = new StringBuffer(); 看看是否能解决。我认为这不会增加任何开销,因为在两种情况下都需要创建一个新char[]数组,因为在第一种情况下,String创建的with 将使用该数组toString()。

    另外,您应该考虑使用,StringBuilder因为它们比首选StringBuffer。

    2020-01-24 14:03:02
    赞同 展开评论
问答标签:
问答地址: