簡體   English   中英

如何避免由於String變量導致的outofMemory錯誤

[英]how to avoid outofMemory error due to String variable

我有大數據輸入xml文件,正在使用stax解析器進行解析,然后將一組特定標記值存儲到txt文件中。 我有4種情況要檢查,但是在第二次之后每次都要檢查它在以下位置的內存不足錯誤

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

如何避免這些情況並使用穩定的代碼?

多達命令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 / StringBuffer連接字符串。 如果使用+則每次創建新的字符串實例時(例如,從循環開始),您都會創建三個字符串(在conversa說,您有'conversa'值):

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

正如其他人已經回答的那樣,首先用StringBuilder替換字符串連接。 如果沒有幫助,請更改算法。

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

與其創建一個大緩沖區,不如嘗試在讀取它們之后將較小的塊寫入文件。

暫無
暫無

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

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