tomcat - leurs classes de cycles précédents sont toujours chargés en mémoire
lors de l'arrêt de mon projet , tomcat dire :
La suite d'applications web ont été arrêtés (reloaded, non déployée), mais leurs classes de courses précédentes sont encore
chargé en mémoire, ce qui entraîne une fuite de mémoire (utiliser un profiler à confirmer) .
Où nous constatons que les classes Qui sont laissées dans la mémoire ?
s'il vous plaît aider moi .
OriginalL'auteur Ali Farozi | 2012-05-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez exécuter
jmap -histo
qui vous montrera des classes chargées.Par exemple:
Une autre façon est de permettre classloading les informations de débogage et de faire quelques scripts pour détecter ce qui est à gauche chargé.
jmap fourni avec le JDK, il n'y a pas besoin de télécharger quoi que ce soit. Comme pour verbose chargement, ajouter
-verbose:class
option de votre commande java.merci ,comment utiliser jmap web-app dans tomcat ? qu'est-ce que <pid> ?
jmap est un outil de ligne de commande, vous ne pouvez pas y accéder par le biais d'une webapp. pid est votre Java id de processus.
merci ,j'ai couru jmap -histo . Comment comprendre ,Pourquoi ma classe restent en mémoire ?
OriginalL'auteur mindas
Lorsque cela se produit, généralement il y a quelque chose dans la mémoire qui est "coincé" la WebappClassLoader (le chargeur de classe qui est responsable du chargement des classes pour une instance de votre webapp) dans la mémoire. Si vous chargez votre webapp plusieurs fois, vous serez en mesure de voir le nombre de WebappClassLoader instances augmente de 1 pour chaque recharge que vous effectuez. C'est généralement pas une fuite dans Tomcat, mais plutôt une fuite, soit directement à votre webapp du code, une fuite dans une bibliothèque que vous utilisez, ou une fuite déclenchée par un peu de Java appels d'API qui font des choses stupides.
Tout d'abord, veuillez lire ceci: http://people.apache.org/~markt/présentations/2010-11-04-Mémoire-Fuites-60mins.pdf. C'est une excellente description de ce qui se passe exactement.
Deuxième, utiliser un profiler pour déterminer ce qui est maintenant des références à des objets chargés par votre WebappClassLoader. Beaucoup de fois, simplement à l'aide d'un ServletContextListener pouvez nettoyer ces références que la webapp est arrêté.
Troisième, si vous trouvez qu'il y a une fuite provenant d'une bibliothèque que vous utilisez, s'il vous plaît laissez-leur savoir à ce sujet. Si vous trouvez une fuite provenant d'une classe dans le JRE, puis regarder les options pour l'utilisation de la JreMemoryLeakPreventionListener: http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JRE_Memory_Leak_Prevention_Listener_-_org.apache.catalina.core.JreMemoryLeakPreventionListener. Si il n'y a pas une option pour tout ce que vous avez trouvé, s'il vous plaît envoyez-par les utilisateurs Tomcat' et laissez-nous savoir ce qu'il manque: nous allons l'ajouter.
Si vous vous demandez comment utiliser un profiler pour étudier ces problèmes, lisez la page 11 à partir du lien ci-dessus.
Je ne comprenais pas Comment je fais mon profil ?
Voulez-vous dire "Profiler"? Un Profiler est un outil qui permet d'inspecter une application en cours d'exécution -- soit le CPU ou de la mémoire (ou les deux). Il y a beaucoup de profileurs disponibles pour Java. Juste Google "Java Profiler". Il m'arrive d'utiliser YourKit Java Profiler parce qu'ils me donner une licence libre à cause de mon association avec l'ASF.
OriginalL'auteur Christopher Schultz