2013-06-14 5 views
3

프로젝트에서 Rhino를 사용하고 있습니다. 짧은 시간 동안 사용 된 ScriptableObjects를 여러 개 만들어서 버려야합니다. 이렇게하면 메모리 누수가 발생합니까?Rhino ScriptableObject 인스턴스를 정리해야합니까?

Context cx = ContextFactory.getGlobal.enter(); 

try { 
    for (String script : Scripts.findAll()) { 
     Scriptable scope = cx.initStandardObjects(); 

     // load script into scope, and do something with it. 

     // do I need to do any cleanup to for the scope? 
    } 
} finally { 
    Context.exit(); 
} 

마르코의 솔루션이 좋은 하나입니다

코드는 다음과 같은 것입니다. jvisualvm을 사용하여 시나리오를 테스트 한 결과 가비지 콜렉션이 문제를 해결한다는 것을 알게되었습니다.

Rhino Garbage Collection in action

+0

로드 된 클래스 다이어그램의 진동은 다소 걱정됩니다. 단 수명 클래스가 동적으로 생성되는 것으로 보입니다. 성능이 저하 될 수 있습니다. –

+0

@MarkoTopolnik 많은 클래스가 Rhino 구현으로 인해 발생했을 가능성이 큽니다. 프로파일 러를 사용해 보았지만 많은 행운이 없었습니다. 메소드 호출마다 생성되는 객체의 수를 검사하는 데 사용할 수있는 도구가 있습니까? – jharig23

+0

사용할 수있는 프로파일 링 도구의 범위에 익숙하지 않습니다. 'jvisualvm'만으로도 할당을 프로파일 링 할 수 있으며 각 할당 이벤트에 대한 스택 트레이스를 표시한다고 생각합니다. 따라서 원하는 것과 비슷한 것이있을 수 있습니다. 그러나 * 클래스 할당 *과 객체 할당 *을 구별하는 데주의하십시오. 전자는 거의 문제가되지 않습니다. JVM은 단명 대상을 대량으로 할당하기 위해 고도로 조정되어 있기 때문입니다. 후자는 완전히 다른 이야기입니다 : 클래스를 로딩하는 것은 꽤 무거운 연산이며, 반드시 피크닉이 아닌 * 클래스 초기화 *가 따라야합니다. –

답변

1

나는 더 정리가 필요하지 않습니다 생각하지만, 어떤 걱정을 dispell하려는 경우,이 테스트하는 것은 매우 쉽습니다. 그냥 게시 한 예제 주위에 무한 루프를 작성하고 잠시 기다려주십시오. jvisualvm으로 프로세스를 모니터링 할 수도 있습니다.