2017-04-13 18 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を回避する最も効率的な方法は何ですか?

私はSOに類似の質問があることがわかりましたが、私の質問に答えているかどうかはわかりません。

+0

を助けるべきである、ということ投稿してください。私の最初のアドバイスは 'Pattern' /' Matcher'オブジェクトなしで置き換えることです。 'String.replace'はまだフードの中で正規表現を使用していますが、' String'はパターンクォートされているので、メモリフットプリントが改善されることに注意してください。 – Mena

+0

こんにちはMena、コードでは、次の行はregex = "\\ [、\\]";同様にPattern/Matcherを使用して置き換えられます。このためには、Pattern/Matcherを使用する必要があると思います。どう思いますか? –

+0

あなたは角括弧をエスケープしているので、 '' [、] ''のためにもリテラルであるようです。 – Mena

答えて

0

あなたが試みることができるいくつかの選択肢:

1 -

2(コマンドラインで-Xmxを使用して)メモリを増やして - 、小さなチャンクに文字列を分割し、チャンクを分析し、することを忘れないでくださいチャンクの終了と次のチャンクの開始にパターンが含まれているかどうかを確認してください。

これは、メモリの使用量を「調整する」のに役立ちます。

0

ヒープのインクリメントがソリューションの1つです。 使用している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 –