繁体   English   中英

OutOfMemoryError Matcher.replaceAll

[英]OutOfMemoryError Matcher.replaceAll

在下面的代码中,我收到一个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上也有类似的问题,但是我不确定它们是否能回答我的问题。

您可以尝试以下替代方法:

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

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

这将帮助您“驯服”内存使用情况。

增加堆是解决方案之一。 这取决于您使用的Java版本。

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

  2. 如果您使用的是Java 7或Java 8,则简单地使用(-Xmx)会有所帮助。

如果您仍然遇到问题,请通过以下链接http://www.wikiconsole.com/analyzing-out-of-memory-situations/进行帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM