SAX, StringBuilder y pérdida de memoria

Tengo un problema extraño. Estoy analizando un documento con un campo de texto grande. En mi sección de personajes estoy usando StringBuilder

currentStory.append(ch, start, length); 

Entonces en mi endElement estoy asignándolo al campo apropiado en mi objeto.

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

setSummaryText(String text) es:

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

Y me estoy quedando sin memoria.

Si cambio setSummaryText a algo completamente extraño como este

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

Estoy bien. Simplemente no puedo averiguar dónde estoy sosteniendo esa referencia? Story es un miembro var de este objeto inicializado con ""; Nota – Asignar a la variable String local en lugar de char [] – también falla.

One Solution collect form web for “SAX, StringBuilder y pérdida de memoria”

Creo que podría tratarse de una optimización del rendimiento del método StringBuffer toString() .

El Sol javadoc dice lo siguiente:

Este método puede codificarse para crear un nuevo objeto String sin asignar nueva memoria para contener una copia de la secuencia de caracteres. En su lugar, la cadena puede compartir la memoria utilizada por el búfer de cadena. Cualquier operación subsiguiente que altere el contenido o la capacidad del búfer de cadena debe hacer una copia del búfer interno en ese momento. Esta estrategia es eficaz para reducir la cantidad de memoria asignada por una operación de concatenación de cadena cuando se implementa utilizando un búfer de cadena.

Debido a que está reutilizando el StringBuffer con el setLength(0) podría estar manteniendo una referencia a todas las Strings que ha creado con toString() .

Reemplazar:

 currentStory.setLength(0); 

con:

 currentStory = new StringBuffer(); 

Y ver si eso lo resuelve. No creo que esto sea una sobrecarga ya que en ambos casos necesitará crear una nueva matriz char[] , ya que en el primer caso la matriz está siendo usada por la String creada con toString() .

Además, debe considerar el uso de StringBuilder ya que son preferibles a StringBuffer .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.