2010-07-19 3 views
0

우리는 Spring 기반의 백엔드가있는 Tomcat 6.0.28에서 작은 JRuby on Rails 응용 프로그램을 실행하고 있습니다. 이클립스 메모리 분석 도구를 사용하여 시간을 보냈으며, JRubyClassLoader의 인스턴스가 새어 나가고 있음을 분명히 알 수 있습니다. 우리 웹 응용 프로그램을 단일 JRuby 런타임 만 사용하도록 설정 한 다음 효과적으로 톰캣에 핫 - 배포를 수행하여 touching 전쟁을 수행했습니다. 몇 번 해본 후, 나는 JRubyClassLoader의 여러 인스턴스를 볼 수 있습니다.JRubyClassLoader가 공개되지 않습니다.

클래스 로더가 해제되지 않기 때문에로드 된 클래스가 해제되지 않고 PermGen 공간이 부족합니다. 내가 찾을 수 없습니다 곳

org.jruby.util.JRubyClassLoader 
    jrubyClassLoader org.jruby.Ruby 
    runtime org.jruby.util.io.ChannelStream 
     reference java.lang.ref.Finalizer 
     next java.lang.ref.Finalizer 

그리고 next java.lang.ref.Finalizer의 목록이 겉으로는 영원히 간다 ... 가리 : 나는 GC 루트에 대한 경로를 볼 수 있습니다 이클립스 메모리 분석을 사용하여

처럼 보이는 실제 GC 루트 누출 용의자에게 보고서를 실행하면

는 # 1 용의자는 "< 시스템 클래스 로더 >"에 의해로드 "java.lang.ref.Finalizer"입니다.

Finalizer가 붙어있는 이유는 무엇입니까?

java.lang.NullPointerException 
    at com.kenai.jffi.Function.finalize(Function.java:177) 
    at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 
    at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) 
    at java.lang.ref.Finalizer.access$100(Finalizer.java:14) 
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 

편집 I 업그레이드 2

:

가능성이 관련 보조 노트로 편집

, 나는 뜨거운 배포를 할 때마다, a는 NullPointerExceptions의 회전을 얻을 JRuby 1.5.1과 나는 여전히 같은 문제를 안고 있습니다.

답변

0

흥미 롭습니다. finalize()이 사용되어서는 안된다는 다른 증거.

귀하의 잘못이 아니며 많은 조치를 취할 수는 없습니다.

어쩌면 JRuby 팀에게 finalize()을 알려 주겠다고 설득하려고합니까? JRuby가 GC까지 기다리지 않고 가장 빠른 시간에 자원 할당 해제를 처리하지 않아야합니까? 개발자 사용 JRuby는 이러한 객체와 상호 작용하지 않으며 JRuby가 제어합니다.