私は、サーバー上で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
お勧めできますか? –