2017-04-13 4 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)) 

나는 완전히 대체하기는 비싸고 OOM을 일으킬 수 있습니다 알고 있습니다. 이런 경우에 OOM을 피하는 가장 효율적인 방법은 무엇입니까?

나는 비슷한 질문이 있음을 알았지 만, 그들 중 누구도 내 질문에 답하는 지 모르겠습니다. 청크를 분석, 작은 덩어리로 문자열을 브레이크하고하는 것을 잊지 마세요 - (명령 줄에서 -Xmx를 사용하여)

2 메모리를 증가 -

1 :

+0

당신은 리터럴을 교체하는 정규 표현식을하지 않아도 도움이 될 것을 게시 할 수 있습니다. 나의 첫 번째 충고는'Pattern' /'Matcher' 객체없이 바꾸는 것이다. 'String.replace'는 여전히 정규 표현식을 사용하고 있지만'String'은 패턴 인용 부호가 붙어 있으므로 메모리 사용량을 향상시킬 수 있습니다. – Mena

+0

안녕하세요 Mena, 코드에서 다음 줄은 regex = "\\ [, \\]"; 유사한 방식으로 Pattern/Matcher를 사용하여 대체됩니다. 이를 위해 Pattern/Matcher를 사용해야 할 것입니다. 어떻게 생각해? –

+0

대괄호를 벗어 났으므로 잘 ""[,] "'문자 그대로 인 것 같습니다. – Mena

답변

0

일부 대안 당신은 시도 할 수 청크의 끝과 다음 청크의 시작 부분에 패턴이 포함되어 있는지 확인하십시오.

이렇게하면 메모리 사용량을 "길들"하는 데 도움이됩니다.

0

발생하는 힙은 솔루션 중 하나입니다. 사용중인 Java 버전에 따라 다릅니다. 당신이 Java6 또는 이전 버전을 사용하는 경우

  1. 는 문자열 PermGen 영역의 일부와 XX 증가 할 수 있습니다를 MaxPermSize = N 당신이 자바 7 또는 Java 8을 사용하는 경우

  2. , 단순히 해주 (-Xmx) 도움이됩니다.

여전히 문제에 직면하는 경우

링크 http://www.wikiconsole.com/analyzing-out-of-memory-situations/ 다음

+0

-Xms 및 -Xmx는 이미 2GB입니다. 그것을 더 늘리는 것이 옳다고 생각하지 마십시오. –

+0

자바 버전이 무엇입니까? – subodhkarwa

+0

Java 버전이 1.6 –