【问题标题】:how to avoid outofMemory error due to String variable如何避免由于 String 变量导致的 outofMemory 错误
【发布时间】:2017-01-20 21:05:42
【问题描述】:

我有大数据输入 xml 文件,我正在使用 stax 解析器对其进行解析,然后我将一组特定的标签值存储到 txt 文件中。我有 4 个案例要检查,但每次在第 2 次之后检查它在

处给出的内存不足错误
for (String conversa: p_convers) {
    converInfo += conversa + "-----"; 
}

在这一行,许多用户将添加大量段落文本,然后我会将其存储到文件中。

为了避免这一阶段的内存问题,我在 Eclipse 中添加了 VM var 参数,如下所示在运行配置中

-Xms1024m
-Xmx1024m
-XX:MaxPermSize=256m

使用此设置,它将成功运行并显示警告消息

Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0

如何避免这些事情并使用稳定的代码?

【问题讨论】:

  • 使用 StringBuilder - 内存效率更高。
  • 关于警告。在 java 8 中,Permgen 被 metaspace 取代。Metaspace 能够自动增加它的大小(与 permgen 不同),但是如果你需要限制它的大小,你可以使用-XX:MaxMetaspaceSize
  • 你能不能每次都在循环内的文件中添加字符串,而不是构建一个巨大的字符串然后把它全部放在一个文件中?另外,每个对话中大约有多少个字符?
  • 如果 StringBuilder 那么我不能使用的许多字符串函数就像我将使用 if(converInfo.endsWith("=====")){ converInfo = converInfo.substring(0, converInfo.长度()-5); } 这些事情对 stringbuilder 来说很困难。最后它是我的本地机器.. 如果我在 linux 服务器上执行相同的 vm 参数和 32gb RAM,这是否可以解决或者它可能随时崩溃?

标签: java memory out-of-memory


【解决方案1】:

正如其他人已经回答的那样,首先将字符串连接替换为 StringBuilder。如果没有帮助,请更改算法。

"At this line a huge set of paragraph text will be added by many users and then I will store it to file. "

不要创建一个大缓冲区,而是在读取较小的块后尝试将它们写入文件。

【讨论】:

    【解决方案2】:

    使用StringBuilder/StringBuffer 连接字符串。如果您使用+,那么每次创建新的字符串实例时,例如在循环中创建三个字符串(假设在conversa 中你得到了'conversa'值):

    • conversa
    • conversa-----
    • converterInfoconversa-----

    【讨论】:

      【解决方案3】:

      直到 命令MaxPermSize 已被删除和更改

      -XmxNNNm
      

      即(就像你已经做过的那样)

      -Xmx1024m
      

      为了避免这个警告,只需删除它。

      如果您继续遇到内存错误,请为服务器添加更多内存。


      现在,您的代码:

      for (String conversa: p_convers) {
          converInfo += conversa + "-----"; 
      }
      

      永远不要在循环中使用字符串连接,这就是 StringBuilder 诞生的原因:

      private final String SEPARATOR = "-----";
      
      ....
      
      StringBuilder converInfo = new StringBuilder();
      for (String conversa: p_convers) {
          converInfo.append(conversa);
          converInfo.append(SEPARATOR);
      
      }
      

      【讨论】:

      • 与 StringBuilder 也一样,还有其他建议吗?
      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多