JRuby ClassLoader没有发布

时间:2010-07-19 18:51:09

标签: java memory-leaks jruby classloader finalizer

我们在Tomcat 6.0.28下使用基于Spring的后端运行一个小型的JRuby on Rails应用程序。我花了一些时间使用Eclipse内存分析工具,我可以肯定地说JRubyClassLoader的实例正在泄漏。我将我们的webapp设置为仅使用单个JRuby运行时,然后我通过touching战争有效地对Tomcat进行了热部署。完成这几次后,我可以看到JRubyClassLoader的几个实例。

由于类加载器没有被释放,它加载的类没有被释放,我们的PermGen空间也用完了。

使用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 Suspects 报告,则#1嫌疑人是“java.lang.ref.Finalizer”,由“< system class loader>”加载。

为什么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 :(得分:0)

有趣。另一个证据表明finalize()不应该使用。

这不是你的错,而且你无能为力。

也许试图说服JRuby团队放弃finalize()? JRuby不应该在最早的时间处理资源释放而不是等到GC吗?开发人员使用 JRuby不与这些对象连接,它们都在JRuby的控制之下。