SAX,StringBuilder和内存泄漏

Ale*_*voy 4 android memory-leaks sax

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

currentStory.append(ch, start, length);
Run Code Online (Sandbox Code Playgroud)

然后在我的endElement中我将它分配给我对象上的相应字段.

  if (name.equals(tagDesc)) {
     inDesc = false;
     if (currentItem != null ) {
         currentItem.setSummaryText(currentStory.toString());
     }
     currentStory.setLength(0);
  }
Run Code Online (Sandbox Code Playgroud)

setSummaryText(String text) 方法是:

    public void setSummaryText(String text) {
      Story = text;
    }
Run Code Online (Sandbox Code Playgroud)

而且我的内存耗尽了.

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

public void setSummaryText(String text) {
      char[] local = text.toString()
      Story = new String(local);
   }
Run Code Online (Sandbox Code Playgroud)

我很好.我只是无法弄清楚我拿着那个参考?Story是用""初始化的对象的成员var; 注 - 分配给本地String变量而不是char [] - 也会失败.

Dav*_*ebb 5

我认为这可能与该StringBuffer toString()方法的性能优化有关.

Sun javadoc说:

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

因为你重新使用StringBuffersetLength(0)它可能会保持到它与创建的所有字符串的引用toString().

更换:

currentStory.setLength(0);
Run Code Online (Sandbox Code Playgroud)

有:

currentStory = new StringBuffer();
Run Code Online (Sandbox Code Playgroud)

并看看是否解决了它.我认为这不会有任何开销,因为在这两种情况下你都需要创建一个新char[]数组,因为在第一种情况下,数组正由String创建的数据库使用toString().

此外,您应该考虑使用StringBuilder他们喜欢的StringBuffer.