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 🙂

Pas facile vraiment. Vous pouvez essayer de faire un dump et puis il a appelé le garbage collector, puis faire un autre dump et voir ce qui est accroché autour. Classique des fuites de mémoire sont causés par 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