簡體   English   中英

如何避免用StringBuilder或Java中的String占用內存

[英]How to avoid out of memory in StringBuilder or String in Java

我從包含xml實體引用的Web服務中獲取了大量數據。 在用相應的字符替換那些字符時,我遇到了內存不足的錯誤。 有人可以舉一個例子來避免這種情況嗎? 我已經在這個問題上停留了兩天。

這是我的代碼:

public  String decodeXMLData(String s)
 {
     s = s.replaceAll(">",">");
     System.out.println("string value is"+s);

     s = s.replaceAll("&lt;", "<"); 
     System.out.println("string value1 is"+s);
     s = s.replaceAll("&amp;", "&");

     s = s.replaceAll("&quot;", "\"");

      s = s.replaceAll("&apos;", "'");

      s = s.replaceAll("&nbsp;", " ");

     return s;
 } 

調用五次replaceAll,將創建五個新的String對象。 總共要使用六個String。 這不是XML解碼字符串的有效方法。

我建議您使用XML編碼/解碼方法的更可靠實現,例如Commons Lang庫中包含的方法。 特別是, StringEscapeUtils可以幫助您完成工作。

所示方法不會導致內存不足錯誤(除非您正在處理的字符串與剩余的可用堆一樣大)。

uou可能遇到的事實是String.substring()調用沒有分配新字符串,而是創建了一個字符串對象,該對象重新使用了調用子字符串的對象。 如果您的代碼存在讀取大型緩沖區並從這些緩沖區創建字符串的情況,則可能需要使用new String(str.substring(index))強制將字符串值重新分配到新的小型char數組中。

您可以嘗試增加JVM內存,但這只會在問題很嚴重的情況下(例如,如果您要聲明千兆字節)延遲不可避免的事件。

如果只有一個String導致嘗試執行此操作會耗盡內存,那么它一定是巨大的:)建議使用SAX解析器來處理它並一點一點地打印它是一個好方法。 或自己將其拆分為較小的部分,然后將每個部分發送到執行所需操作的例程中,然后丟棄結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM