서버에서 HTTP Get 요청을 Java 소스 코드로 응답 구문 분석하는 다음 메소드가 있습니다. 같은 시간에 여러 파일에 대해이 작업을 수행합니다. 이것은 처음 몇 파일을 아주 잘 작동하지만 일정 시간 후 나는 예외를 얻을 :내 코드에서 메모리 누수를 찾을 수 없습니다.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
예외가 줄을 발생합니다 : jp.parse(new StringReader(responseString));
내가 문제가 메모리 누수라고 생각 파일 때문에 나는 정말로 크지 않은 것을 파싱하려고합니다. 겨우 수십 줄의 코드. 하지만이 예외의 원인을 찾을 수 없습니다. 어떤 힌트?
public void retrieveSourceCode() {
try {
System.out.println("Try to get: " + getSourceCodeURI());
String responseString = RestServices.getInstance().sendGetRequestJsonTextToString(getSourceCodeURI());
JavaSourceFactory jsf = new JavaSourceFactory();
JavaParser jp = new JavaParser(jsf);
jp.parse(new StringReader(responseString));
Iterator<?> iterator = jsf.getJavaSources();
while(iterator.hasNext()) {
JavaSource source = ((JavaSource) iterator.next());
fileName = source.getQName().toString();
sourceCode = source.toString();
}
} catch (ClientProtocolException e) {
fileName = "no file name";
sourceCode = "no sourcecode available";
e.printStackTrace();
} catch (IOException e) {
fileName = "no file name";
sourceCode = "no sourcecode available";
e.printStackTrace();
} catch (RestServicesException e) {
fileName = "no file name";
sourceCode = "no sourcecode available";
e.printStackTrace();
} catch (RecognitionException e) {
fileName = "no file name";
sourceCode = "no sourcecode available";
e.printStackTrace();
} catch (TokenStreamException e) {
fileName = "no file name";
sourceCode = "no sourcecode available";
e.printStackTrace();
}
if (before == null) {
beforeSourceCode = "no before sourcecode available";
} else {
try {
String responseString = RestServices.getInstance().sendGetRequestJsonTextToString(getBeforeVersionURI());
JavaSourceFactory jsf = new JavaSourceFactory();
JavaParser jp = new JavaParser(jsf);
jp.parse(new StringReader(responseString));
Iterator<?> iterator = jsf.getJavaSources();
while(iterator.hasNext()) {
JavaSource source = (JavaSource) iterator.next();
beforeSourceCode = source.toString();
}
} catch (ClientProtocolException e) {
beforeSourceCode = "no before sourcecode available";
} catch (RecognitionException e) {
beforeSourceCode = "no before sourcecode available";
e.printStackTrace();
} catch (TokenStreamException e) {
beforeSourceCode = "no before sourcecode available";
e.printStackTrace();
} catch (IOException e) {
beforeSourceCode = "no before sourcecode available";
e.printStackTrace();
} catch (RestServicesException e) {
beforeSourceCode = "no before sourcecode available";
e.printStackTrace();
}
}
if (after == null) {
afterSourceCode = "no after sourcecode available";
} else {
try {
String responseString = RestServices.getInstance().sendGetRequestJsonTextToString(getAfterVersionURI());
JavaSourceFactory jsf = new JavaSourceFactory();
JavaParser jp = new JavaParser(jsf);
jp.parse(new StringReader(responseString));
Iterator<?> iterator = jsf.getJavaSources();
while(iterator.hasNext()) {
JavaSource source = (JavaSource) iterator.next();
afterSourceCode = source.toString();
}
} catch (ClientProtocolException e) {
afterSourceCode = "no after sourcecode available";
} catch (RecognitionException e) {
afterSourceCode = "no after sourcecode available";
e.printStackTrace();
} catch (TokenStreamException e) {
afterSourceCode = "no after sourcecode available";
e.printStackTrace();
} catch (IOException e) {
afterSourceCode = "no after sourcecode available";
e.printStackTrace();
} catch (RestServicesException e) {
afterSourceCode = "no after sourcecode available";
e.printStackTrace();
}
}
getChangeSet().addAffectedFile(getFileName());
}
왜 메모리 프로파일 러를 사용하지 않고 메모리를 사용하고 있는지보십시오. – NPE
메모리 덤프를 생성하고 분석 했습니까? – Thomas
추천 할만한가요? –