我们在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,我仍然看到同样的问题。
答案 0 :(得分:0)
有趣。另一个证据表明finalize()
不应该使用。
这不是你的错,而且你无能为力。
也许试图说服JRuby团队放弃finalize()
? JRuby不应该在最早的时间处理资源释放而不是等到GC吗?开发人员使用 JRuby不与这些对象连接,它们都在JRuby的控制之下。