JRubyClassLoader не выпускается - PullRequest
0 голосов
/ 19 июля 2010

Мы запускаем небольшое приложение 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, и я все еще вижу те же проблемы.

1 Ответ

0 голосов
/ 19 июля 2010

интересно.еще одно доказательство того, что finalize() не следует использовать.

это не ваша вина, и вы ничего не можете с этим поделать.

Может быть, попытаться убедить команду JRuby бросить finalize()?не должен ли JRuby позаботиться об освобождении ресурсов как можно раньше, вместо того, чтобы ждать до GC?Разработчики , использующие JRuby, не взаимодействуют с этими объектами, все они находятся под контролем JRuby.

...