우리는 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과 나는 여전히 같은 문제를 안고 있습니다.