2010-07-19 36 views
0

Nous exécutons une petite application JRuby on Rails sous Tomcat 6.0.28 avec un backend Spring. J'ai passé du temps avec l'outil d'analyse de la mémoire Eclipse et je peux certainement dire que les instances du JRubyClassLoader fuient. J'ai configuré notre webapp pour n'utiliser qu'une seule exécution de JRuby et j'ai ensuite fait un déploiement à chaud vers Tomcat par touching la guerre. Après avoir fait cela quelques fois, je peux voir plusieurs instances de la JRubyClassLoader assis autour.JRubyClassLoader n'est pas publié

Étant donné que le chargeur de classe n'est pas libéré, les classes qu'il charge ne sont pas libérées et nous manquons d'espace PermGen.

Utilisation d'Eclipse Analyse mémoire, je peux voir le chemin à la racine du GC ressemble:

org.jruby.util.JRubyClassLoader 
    jrubyClassLoader org.jruby.Ruby 
    runtime org.jruby.util.io.ChannelStream 
     reference java.lang.ref.Finalizer 
     next java.lang.ref.Finalizer 

Et la liste des next java.lang.ref.Finalizer se poursuit apparemment pour toujours ... à un point où je ne peux pas sembler trouver la racine GC actuelle.

Si exécuter les fuites Suspects rapport, le # 1 suspect est "java.lang.ref.Finalizer", chargé par "< classe système chargeur >".

Avez-vous des idées sur la raison pour laquelle le Finalizer reste?

EDIT

Comme une note de côté peut-être liée, chaque fois que je fais un déploiement à chaud, une obtenir une flopée de 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) 

EDIT 2

Je mis à jour à JRuby 1.5.1 et je vois encore les mêmes problèmes.

Répondre

0

intéressant. une autre preuve que finalize() ne devrait pas être utilisée.

Ce n'est pas votre faute et il n'y a pas grand chose à faire à ce sujet.

peut-être essayer de convaincre l'équipe JRuby de déposer finalize()? JRuby ne devrait-il pas s'occuper de la désaffectation des ressources le plus tôt possible au lieu d'attendre le GC? Les développeurs utilisant JRuby n'interfèrent pas avec ces objets, ils sont tous sous le contrôle de JRuby.