2017-04-13 70 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 –