繁体   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