Tomcat Réparer Fuite De Mémoire?
Je suis en utilisant 6.0.20 j'ai un certain nombre de web applications en cours d'exécution sur le serveur, au fil du temps, environ 3 jours, et le serveur a besoin de redémarrer sinon, le serveur se bloque et ne répond pas.
J'ai les paramètres suivants pour la JVM:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\logs
Cela me donne une hprof fichier que j'ai chargé à l'aide de Java VisualVM qui identifie les suivantes:
byte[] 37,206 Instances | Size 86,508,978
int[] 540,909 Instances | Size 55,130,332
char[] 357,847 Instances | Size 41,690,928
La liste est longue, mais comment puis-je savoir quelle est la cause de ces problèmes?
Je suis en utilisant la Nouvelle Relique de surveiller la JVM et une seule erreur semble apparaître, mais c'est un récurrentes, org.apache.catalina.connecteur. ClientAbortException. Est-il possible que lorsqu'une session utilisateur est annulée, toutes les connexions de base de données ou des variables créées ne sont pas fermés et sont donc orphelins?
Il y a une fonction qui est utilisée assez fortement tout au long de chaque application web, vous ne savez pas si cela a une quelconque incidence sur la fuite:
public static String replaceCharacters(String s)
{
s = s.replaceAll(" ", " ");
s = s.replaceAll(" ", "_");
s = s.replaceAll("1", "e");
s = s.replaceAll("/", "");
s = s.replaceAll("--", "-");
s = s.replaceAll("&", "and");
s = s.replaceAll("&", "and");
s = s.replaceAll("__", "_");
s = s.replaceAll("\\(", "");
s = s.replaceAll("\\)", "");
s = s.replaceAll(",", "");
s = s.replaceAll(":", "");
s = s.replaceAll("4", "u");
s = s.replaceAll("-", "_");
s = s.replaceAll("\\+", "and");
s = s.replaceAll("\"", "");
s = s.replaceAll("\\[", "");
s = s.replaceAll("\\]", "");
s = s.replaceAll("\\*", "");
return s;
}
Est-il possible que lorsqu'un utilisateur connexion est abandonnée, comme un navigateur de l'utilisateur fermés ou les utilisateurs qui ont quitté le site que toutes les variables, les connexions, etc... sont purgés/libéré, mais n'est pas GC censé géré qui?
Ci-dessous sont mes réglages JVM:
-Dcatalina.base=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20
-Dcatalina.home=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20
-Djava.endorsed.dirs=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\endorsed
-Djava.io.tmpdir=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\conf\logging.properties
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8
-javaagent:c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\newrelic\newrelic.jar
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\logs
-Dcom.sun.management.jmxremote.port=8086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false vfprintf
-Xms1024m
-Xmx1536m
Ai-je raté quelque chose? Le serveur dispose de 3 go de ram.
Toute aide serait grandement appréciée 🙂
ThreadLocal
et de la mauvaise utilisation des static
caches. Sont vos applications sous charge ou d'inactivité?C'est un environnement de production, chaque application utilise une classe qui a les fonctions suivantes: public static String removeLineBreaks(String s) public static String replace(String s, String s1, String s2) public static String replaceCharacters(String s)
Complément d'enquête à l'aide d'Eclipse de la Mémoire de l'Analyseur, les deux grandes questions sont org.apache.catalina.loader.WebappClassLoader et org.apache.de nommage.les ressources.ResourceCache, comme je suis en utilisant Tomcat 6.0.20, je crois WebappClassLoader est une question qui n'a pas été résolu jusqu'à Tomcat 7.
Si vous n'êtes pas de déploiement/annulant le déploiement des charges de fois, puis le chargeur de classe est pas votre problème. C'est grand, car il fait référence à toutes vos classes. Si vous déployez/annulant le déploiement, alors vous pourriez avoir un chargeur de classe de fuite; la mauvaise nouvelle c'est qu'elles sont extrêmement difficiles à dépister.
Après le changement de pilote JDBC, les choses se sont calmées, a remarqué que les classes sont de déchargement, le total des déchargé a augmenté de 117 à partir de 68 plus tôt ce matin. Tas toujours fluctuant entre 300 et 600 MO environ. 8 fois par minute. Pour les 23 sites et 8 applications web je suppose que c'est pas trop mal.
OriginalL'auteur iggyweb | 2013-07-29
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un dump de l'analyseur qui permet de voir ce qui rend ces objets accessibles. Choisissez un objet, et voir ce que les autres l'objet ou les objets se référer à elle ... et de travailler vers l'arrière à travers les chaînes jusqu'à ce que vous trouver un "GC de la racine" ou ou une application spécifique à la classe que vous reconnaître.
Ici sont un couple de références sur l'analyse des instantanés de la mémoire et de la mémoire des profileurs:
Une fois que vous avez identifié que vous avez passé la plupart de la voie à l'identification de la source de stockage de votre fuite.
Que la fonction n'a pas d'incidence directe sur la fuite. Il ne sera certainement pas la cause. (Il pourrait générer beaucoup de déchets de la Chaîne des objets ... mais c'est une autre question.)
J'ai remarqué Abandonné de nettoyage de la connexion threads qui se rapportent à la com.mysql.jdbc.NonRegisteringDriver$1.exécuter(NonRegisteringDriver.java:93) est-ce lié?
Pense que j'ai peut-être tombé sur quelque chose ici, je suis en utilisant mysql-connector-java-5.1.21-bin.jar qui je crois a un problème faisant que Tomcat ne pas relâcher abandonné threads. Vu à l'aide de mysql-connector-java-5.1.25-bin.jar au lieu de cela.
C'est certainement une explication plausible. Essayer et de voir si en changeant le POT à l'aide. Il devrait être un "faible risque" du changement. Toutefois, étant donné le nombre d'objets de fuite, je soupçonne que ce que vous avez trouvé n'est pas la seule fuite importante.
Je vais commencer par là, j'ai remarqué que le tas est entre 1 et 1,5 GO mais le PermGen est entre 55 MO à 85 mo, je pense que cela demande trop d'attention, ne serait-ce causer la GC à peu près le plus constamment? Avez-vous une recommandation de taille pour le PermGen?
OriginalL'auteur Stephen C
J'ai migré tous les projets de Tomcat 7.0.42 et mes erreurs ont disparu, nos sites web sont beaucoup plus stable et un peu plus rapide, nous sommes en utilisant moins de mémoire et d'utilisation de l'uc est de loin préférable.
OriginalL'auteur iggyweb
Démarrer le serveur en local environnement de dev, de joindre des profils (yourkit de préférence), Prendre la heap dump périodiquement, Vous verrez la croissance dans l'objet byte[] et vous pouvez connecter ces
byte[]
avec votre classe d'application de fuite avec cet outil qui va vous aider à idenfity défaut dans le codefixer la partie <!-->
Entendez-vous résoudre le ClientAbortException? Dois-je prolonger chaque fonction pour le faire ou peut-il être fait par la déclaration d'une classe dans l'server.xml fichier pour gérer expurgée des demandes à l'échelle mondiale?
OriginalL'auteur Jigar Joshi