如何避免由于String变量

时间:2016-09-13 09:50:51

标签: java memory out-of-memory

我有大数据输入xml文件,我使用stax解析器解析,然后我将一组特定的标记值存储到txt文件。我有4个案例需要检查,但每次检查后都会在

中检查出内存错误
for (String conversa: p_convers) {
    converInfo += conversa + "-----"; 
}

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

为了避免这段内存问题,我在Eclipse中添加了VM var参数,如下面的Run configuration

-Xms1024m
-Xmx1024m
-XX:MaxPermSize=256m

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

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

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

3 个答案:

答案 0 :(得分:1)

最多命令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);

}

答案 1 :(得分:1)

使用StringBuilder / StringBuffer来连接字符串。如果您使用+,那么每次创建新的字符串实例时,例如从循环开始,你创建了三个字符串(比如conversa你得到了' conversa' value):

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

答案 2 :(得分:0)

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

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

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