【问题标题】:How to avoid out of memory in StringBuilder or String in Java如何避免 StringBuilder 或 Java 中的 String 内存不足
【发布时间】:2011-02-21 09:16:09
【问题描述】:

我从包含 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;
 } 

【问题讨论】:

    标签: java xml string


    【解决方案1】:

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      调用五次replaceAll,您将创建五个新的字符串对象。您总共使用了六个字符串。这不是对字符串进行 XML 解码的有效方式。

      我建议您使用更强大的 XML 编码/解码方法实现,例如 Commons Lang 库中包含的那些。特别是,StringEscapeUtils 可以帮助您完成工作。

      【讨论】:

        【解决方案4】:

        所示方法不会导致内存不足错误(除非您正在处理的字符串与剩余的空闲堆一样大)。

        你可能遇到的事实是String.substring() 调用不分配新字符串,而是创建一个字符串对象,该对象重用调用子字符串的对象。如果您的代码存在读取大缓冲区并从这些缓冲区创建字符串,您可能需要使用 new String(str.substring(index)) 强制将字符串值重新分配到新的小字符数组中。

        【讨论】:

        • 我的猜测是它没有用完堆,而是 permgen 内存。一些大量的 String.intern() 调用可能在幕后某处进行。尝试编辑大文件的方式可以相当可靠地关闭 Eclipse XML 和 JSP 编辑器...
        【解决方案5】:

        您可以尝试增加 JVM 内存,但这只会延迟问题严重时不可避免的情况(例如,如果您试图声明千兆字节)。

        如果您有一个字符串导致您尝试执行此操作时内存不足,那么它一定是巨大的 :) 建议使用 SAX 解析器来处理它并以点点滴滴的方式打印它是一个很好的建议. 或者您自己将其拆分成更小的部分,然后将其中的每一个发送到执行您想要的操作的例程中,然后丢弃结果。

        【讨论】:

          猜你喜欢
          • 2020-03-26
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-02
          相关资源
          最近更新 更多