在下面的代码中,我遇到了 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 版本。
如果您使用的是 Java6 或更早版本,字符串是 PermGen Area 的一部分,可以通过 XX:MaxPermSize=N 来增加
如果您使用的是 Java 7 或 Java 8,只需更改 (-Xmx) 就会有所帮助。
如果您仍然遇到问题,请点击链接 http://www.wikiconsole.com/analyzing-out-of-memory-situations/ 应该有所帮助