Fuite de mémoire Tomcat8
Quand j'essaie d'arrêter tomcat8 sur Java 8, je reçois quelques fuites de mémoire des erreurs:
org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)
com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:40)
23-Jan-2015 08:18:10.202 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [pool-5-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread
23-Jan-2015 08:18:10.205 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [com.util.ThreadLocalProperties$1] (value [com.util.ThreadLocalProperties$1@2fafda6e]) and a value of type [java.util.Properties] (value [{}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
La classe ThreadLocalProperties est:
public class ThreadLocalProperties extends Properties {
private static final long serialVersionUID = -4260632266508618756L;
private final ThreadLocal<Properties> localProperties = new ThreadLocal<Properties>() {
@Override
protected Properties initialValue() {
return new Properties();
}
};
public ThreadLocalProperties(Properties properties) {
super(properties);
}
@Override
public String getProperty(String key) {
String localValue = localProperties.get().getProperty(key);
return localValue == null ? super.getProperty(key) : localValue;
}
@Override
public Object setProperty(String key, String value) {
return localProperties.get().setProperty(key, value);
}
public ThreadLocal<Properties> getThreadLocal() {
return localProperties;
}
}
et je le démarrer et l'arrêter comme ceci:
@WebListener()
public class GeneralListener implements ServletContextListener {
ThreadLocalProperties threadLocalProperties = new ThreadLocalProperties(System.getProperties());
@Override
public void contextDestroyed(ServletContextEvent arg0) {
threadLocalProperties.getThreadLocal().remove();
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.setProperties(threadLocalProperties);
}
}
Pourquoi aurais-je obtenir tout cela fuites de mémoire des erreurs? ainsi, quand je le lance en arrêt, il n'a pas l'arrêter, je dois manuellement tuer le processus.
Quel est le problème?
source d'informationauteur Dejell
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien à craindre. C'est un message standard tomcat sorties lorsqu'il détecte l'application a démarré sa propre
Thread
ou créé unThreadLocal
. Si vous résiliez le fil sur arrêt et retirez la threadlocals quand ils ne sont plus nécessaires, alors il n'y aura pas de problème.J'ai vu ce comportement, lorsqu'une application a commencé
ScheduledExecutor
(mais ce sera le cas avec tout autreThread
/TheadPool
) et n'avait pas l'arrêter surcontextDestroyed
. Afin de vérifier si vous êtes en arrêt de votre fils sur demande/arrêt du serveur.Maintenant sur votre problème concret pourquoi le serveur ne s'arrête pas:
Les pilotes JDBC sont enregistrés dans la JVM comme des singletons, et sont communs à tous les webapps. Plus d'infos ici. La meilleure solution à votre problème est de déplacer le pilote MySQL dans de Tomcat
/lib
dossier. Si vous ne pouvez pas faire ce que vous pouvez essayer cette mais il ressemble plus à un hack, que d'une vraie solution.Je pense que votre problème est similaire à cette. Lorsque vous redéployer l'application, apache déploie progressivement sur lui-même, où
system.gc();
ne travaillent pas et, après quelques redéploiement en phase de développement permanent généré espace est plein et vous obtenez fuite de mémoire d'erreur.Veuillez garder le redémarrage de votre serveur après quelques redéploiement, de sorte que le PermGen space peut être effacé avec un redémarrage.
Ou
un vous pouvez également résoudre en changeant la PermGen space dans le serveur.
Veuillez visiter ici.
J'espère que cela va vous aider.