2012-01-13 3 views
-1

서버에서 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()); 
    } 
+3

왜 메모리 프로파일 러를 사용하지 않고 메모리를 사용하고 있는지보십시오. – NPE

+1

메모리 덤프를 생성하고 분석 했습니까? – Thomas

+0

추천 할만한가요? –

답변

2

getChangeSet().addAffectedFile()의 기능은 무엇입니까? 이미 제안 된 것처럼 프로파일 러를 사용하고 싶습니까?

일들을 고수하고 있습니까? 또한, 그 방법을 조각으로 나누고 싶을 수도 있습니다.

+0

이것은 전달 된 문자열을 arraylist에 추가합니다. – RoflcoptrException

+0

arraylist가 제거 되었습니까? – Bill

+0

아니요 그 문자열이 필요합니다.) – RoflcoptrException

1

왜 동일한 처리 코드가있는 catch 블록을 계속해서 반복합니까? 나는 한번 Exception을 잡아서 끝내겠습니다. 나머지는 시각적으로 혼란을 줄뿐입니다.

하지만 그 질문에 대한 답이 아니다 ....

그 클래스 당신이 있습니까, 아니면 도서관에서입니까? 나는 그것이 Apache JAXMe 라이브러리라고 추측합니다.

Sun JVM을 사용하는 경우 Visual VM 1.3.3을 다운로드하고 모든 플러그인을 설치하고 열어서 프로세스를 시작하여 현재 진행중인 작업을 확인할 수 있습니다. 그것은 세대, CPU, 쓰레드 등에 의해 메모리를 보여줄 것입니다. 이것은 훌륭한 도구입니다.

finally 블록을 추가하고 배열을 지우는 것이 어떨까요? 전화 통화 사이에 그 데이터를 유지하지 않습니까? 그렇다면 다른 발신자가 어떻게 조회하고 결과를 사용합니까? 어쩌면 WeakHashMap이 당신의 솔루션이 될 수 있습니다. 필요한 경우 정리할 수있는 기회를 JVM에 제공합니다.

스레드 안전에주의해야합니다. 서블릿은 공유되므로 변경 가능한 객체에 매달려 있다면 동기화에 대해 걱정할 필요가 있습니다.

+0

그렇습니다. 하나의 try/catch 블록으로 리팩터링되어야합니다. 그것은 내 수업입니다. – RoflcoptrException

+0

어떤 배열에 대해 이야기하고 있습니까? – RoflcoptrException

+0

요소의 수를 인쇄 한 것. 나는 당신이 지역 변수라는 것을 짐작했다. – duffymo

관련 문제