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.