2017-04-13 75 views
0

在下面的代碼,我得到一個OutOfMemoryError的OutOfMemoryError Matcher.replaceAll

String resultStr = json.format(obj); 
String regex = "null"; 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher(resultStr); 
resultStr = m.replaceAll(""); 

堆棧跟蹤低於:

at java/lang/StringBuffer.ensureCapacityImpl(StringBuffer.java:338(Compiled Code)) 
at java/lang/StringBuffer.append(StringBuffer.java:204(Compiled Code)) 
at java/lang/StringBuffer.append(StringBuffer.java:1031(Compiled Code)) 
at java/util/regex/Matcher.appendReplacement(Matcher.java:757(Compiled Code)) 
at java/util/regex/Matcher.replaceAll(Matcher.java:824(Compiled Code)) 

我知道的replaceAll是昂貴的,並可能導致OOM。在這種情況下避免OOM的最有效方法是什麼?

我發現在這裏有類似的問題,但我不確定他們中的任何人是否回答我的問題。

+0

你不需要更換字面正則表達式。我的第一個建議是嘗試替換而不使用'Pattern' /'Matcher'對象。請注意,'String.replace'仍然使用正則表達式,但也確保搜索'String'是模式引用的,這可能會改善內存佔用。 – Mena

+0

嗨,梅納,在代碼中,下一行是regex =「\\ [,\\]」;這也是以類似的方式使用模式/匹配器替換的。爲此我想我必須使用Pattern/Matcher。你怎麼看? –

+0

以及''[,]「'好像是一個文字,因爲你正在轉義方括號。 – Mena

回答

0

一些替代品,你可以嘗試:

1 - 增加內存(在命令行中使用-Xmx)

2 - 打破字符串成小塊,分析塊,並且不要忘了檢查一個塊的結尾加上下一個的開始是否包含該模式。

這將幫助您「馴服」內存使用情況。

0

增大堆是解決方案之一。 這取決於您使用的Java版本。

  1. 如果使用的Java6或舊版本中,字符串是PermGen的區域的一部分,並且可以通過XX增加:MaxPermSize參數= N

  2. 如果使用的Java 7或Java 8,簡單地碰撞(-Xmx)應該有所幫助。

如果你仍然面臨的問題後,繼鏈接http://www.wikiconsole.com/analyzing-out-of-memory-situations/應該幫助

+0

-Xms和-Xmx已經是2GB。不要認爲增加它是正確的。 –

+0

什麼是您的Java版本? – subodhkarwa

+0

Java版本是1.6 –