OutOfMemoryError Matcher.replaceAll

时间:2017-04-13 10:21:43

标签: java regex out-of-memory matcher

在下面的代码中,我得到一个OutOfMemoryError

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的最有效方法是什么?

我发现在SO上有类似的问题,但我不确定他们是否回答了我的问题。

2 个答案:

答案 0 :(得分:0)

您可以尝试一些替代方案:

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

2 - 将字符串分解为更小的块,分析块,并且不要忘记检查块的结尾加上下一个的开头是否包含模式。

这将有助于你驯服"内存使用情况。

答案 1 :(得分:0)

Incresing heap是其中一个解决方案。 这取决于您使用的Java版本。

  1. 如果您使用的是Java6或更早版本,则字符串是PermGen区域的一部分,可以增加XX:MaxPermSize = N

  2. 如果您使用的是Java 7或Java 8,只需碰撞(-Xmx)即可。

  3. 如果您仍然遇到问题,请在链接http://www.wikiconsole.com/analyzing-out-of-memory-situations/之后提供帮助