Мы запускаем небольшое приложение JRuby on Rails под Tomcat 6.0.28 с бэкэндом на основе Spring.Я провел некоторое время с инструментом анализа памяти Eclipse, и я точно могу сказать, что экземпляры JRubyClassLoader
протекают.Я настроил наше веб-приложение на использование только одной среды исполнения JRuby, а затем эффективно выполнил горячее развертывание на Tomcat к touching
войне.Сделав это несколько раз, я вижу несколько экземпляров JRubyClassLoader
.
Поскольку загрузчик классов не освобождается, загруженные им классы не освобождаются, и мы заканчиваемпространства ПермГен.
Используя Eclipse Memory Analysis, я вижу, что путь к корню GC выглядит следующим образом:
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.
Если запустить отчет Leak Suspect , подозреваемым # 1 будет "java.lang.ref.Finalizer", загруженный "".
Есть какие-нибудь идеи, почему Финализатор торчит?
РЕДАКТИРОВАТЬ
В качестве возможной связанной примечания каждый раз, когда я выполняю горячее развертывание, получить убой NullPointerExceptions
:
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)
РЕДАКТИРОВАТЬ 2
Я обновился до JRuby 1.5.1, и я все еще вижу те же проблемы.