it-swarm.com.de

Ist dies sehr wahrscheinlich ein Speicherverlust in Tomcat?

Ich habe Tomcat so konfiguriert, dass es mit einer anderen externen Open Source arbeitet.

Nachdem der Kater jedoch einige Minuten läuft, bekomme ich:

SEVERE: Die Webanwendung [/ MyProject] hat ein ThreadLocal mit .__ erstellt. Schlüssel des Typs [Java.lang.ThreadLocal] (Wert [[email protected]]) und einen Wert des Typs [org.Apache.axis.MessageContext] (Wert [[email protected]]), konnte es jedoch nicht entfernen, wenn Die Webanwendung wurde gestoppt. Dies ist sehr wahrscheinlich, um eine .__ zu erstellen. Speicherleck.

Was könnte es verursachen?

Wo muss ich suchen? Könnte es auf Tomcat Datapooling sein?

Und was bedeuten Threads in Tomcat?

BEARBEITET

Hier ist meine volle Spur. Die Anwendung scheint ihren Kontext neu zu laden, solange sie noch läuft - und ich weiß nicht warum!

Mar 13, 2011 10:56:12 PM org.Apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
Mar 13, 2011 10:56:12 PM org.Apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
Mar 13, 2011 10:56:13 PM org.Apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
Mar 13, 2011 10:56:14 PM org.Apache.catalina.core.StandardWrapper unload
INFO: Waiting for 1 instance(s) to be deallocated
Mar 13, 2011 10:56:14 PM org.Apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/MyProject] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/MyProject] registered the JBDC driver [Oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [NioSocketAcceptor-1] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [NioProcessor-1] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [NioProcessor-4] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [bitronix-disk-force-batcher] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [bitronix-scheduler] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] is still processing a request that has yet to finish. This is very likely to create a memory leak. You can control the time allowed for requests to finish by using the unloadDelay attribute of the standard Context implementation.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [NioProcessor-7] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyProject] appears to have started a thread named [NioProcessor-2] but has failed to stop it. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [Java.lang.ThreadLocal] (value [[email protected]]) and a value of type [org.mvel2.debug.DebuggerContext] (value [[email protected]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [org.Apache.axis.utils.XMLUtils.ThreadLocalDocumentBuilder] (value [[email protected]]) and a value of type [com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl] (value [[email protected]cfa]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [null] (value [[email protected]]) and a value of type [Java.util.HashMap] (value [{com.Sun.faces.patternCache={ = }}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [Java.lang.ThreadLocal] (value [[email protected]]) and a value of type [org.Apache.axis.MessageContext] (value [[email protected]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [org.Apache.axis.utils.XMLUtils.ThreadLocalDocumentBuilder] (value [[email protected]]) and a value of type [com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl] (value [[email protected]84]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [org.springframework.core.NamedThreadLocal] (value [Transactional resources]) and a value of type [Java.util.HashMap] (value [{[email protected][email protected]}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Mar 13, 2011 10:56:15 PM org.Apache.catalina.loader.WebappClassLoader clearThreadLocalMap
SEVERE: The web application [/MyProject] created a ThreadLocal with key of type [null] (value [[email protected]]) and a value of type [com.Sun.faces.application.ApplicationAssociate] (value [[email protected]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
2011-03-13 22:57:27,734 ERROR (            ContextLoader.Java:220)     - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext-hibernate.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext-hibernate.xml]: Invocation of init method failed; nested exception is Java.lang.OutOfMemoryError: Java heap space
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.Java:328)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.Java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.Java:1325)
44
Dejell

Die Nachricht ist eigentlich ziemlich klar: Etwas erstellt eine ThreadLocal mit dem Wert des Typs org.Apache.axis.MessageContext - das ist ein toller Hinweis. Dies bedeutet höchstwahrscheinlich, dass das Apache-Axis-Framework die Bereinigung nach sich selbst vergessen hat. Das gleiche Problem ist zum Beispiel in Logback aufgetreten. Sie sollten sich nicht die Mühe machen, aber es wäre eine gute Idee, einen Fehler an das Axis-Team zu melden.

Tomcat meldet diesen Fehler, da die ThreadLocals pro HTTP-Arbeitsthreads erstellt werden. Ihre Anwendung ist nicht implementiert, aber HTTP-Threads bleiben erhalten - und diese ThreadLocals ebenfalls. Dies kann zu Speicherverlusten führen (org.Apache.axis.MessageContext kann nicht entladen werden) und einige Probleme, wenn diese Threads zukünftig wiederverwendet werden.

Für Details siehe: http://wiki.Apache.org/Tomcat/MemoryLeakProtection

23

Ich habe der Methode @PreDestroy in meiner CDI @ApplicationScoped-Bean Folgendes hinzugefügt. Wenn ich TomEE 1.6.0 (heute Tomcat7.0.39) heruntergefahren habe, werden die lokalen Threads gelöscht.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pf;

import Java.lang.ref.WeakReference;
import Java.lang.reflect.Array;
import Java.lang.reflect.Field;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Administrator
 * 
 * google-gson issue # 402: Memory Leak in web application; comment # 25
 * https://code.google.com/p/google-gson/issues/detail?id=402
 */
public class ThreadLocalImmolater {

    final Logger logger = LoggerFactory.getLogger(ThreadLocalImmolater.class);

    Boolean debug;

    public ThreadLocalImmolater() {
        debug = true;
    }

    public Integer immolate() {
        int count = 0;
        try {
            final Field threadLocalsField = Thread.class.getDeclaredField("threadLocals");
            threadLocalsField.setAccessible(true);
            final Field inheritableThreadLocalsField = Thread.class.getDeclaredField("inheritableThreadLocals");
            inheritableThreadLocalsField.setAccessible(true);
            for (final Thread thread : Thread.getAllStackTraces().keySet()) {
                    count += clear(threadLocalsField.get(thread));
                    count += clear(inheritableThreadLocalsField.get(thread));
            }
            logger.info("immolated " + count + " values in ThreadLocals");
        } catch (Exception e) {
            throw new Error("ThreadLocalImmolater.immolate()", e);
        }
        return count;
    }

    private int clear(final Object threadLocalMap) throws Exception {
        if (threadLocalMap == null)
                return 0;
        int count = 0;
        final Field tableField = threadLocalMap.getClass().getDeclaredField("table");
        tableField.setAccessible(true);
        final Object table = tableField.get(threadLocalMap);
        for (int i = 0, length = Array.getLength(table); i < length; ++i) {
            final Object entry = Array.get(table, i);
            if (entry != null) {
                final Object threadLocal = ((WeakReference)entry).get();
                if (threadLocal != null) {
                    log(i, threadLocal);
                    Array.set(table, i, null);
                    ++count;
                }
            }
        }
        return count;
    }

    private void log(int i, final Object threadLocal) {
        if (!debug) {
            return;
        }
        if (threadLocal.getClass() != null &&
            threadLocal.getClass().getEnclosingClass() != null &&
            threadLocal.getClass().getEnclosingClass().getName() != null) {

            logger.info("threadLocalMap(" + i + "): " +
                        threadLocal.getClass().getEnclosingClass().getName());
        }
        else if (threadLocal.getClass() != null &&
                 threadLocal.getClass().getName() != null) {
            logger.info("threadLocalMap(" + i + "): " + threadLocal.getClass().getName());
        }
        else {
            logger.info("threadLocalMap(" + i + "): cannot identify threadlocal class name");
        }
    }

}
6
Howard

Der Schlüssel "Transaktionsressourcen" sieht so aus, als würden Sie ohne eine ordnungsgemäße Transaktion mit der Datenbank sprechen. Stellen Sie sicher, dass die Transaktionsverwaltung ordnungsgemäß konfiguriert ist und kein Aufrufpfad zum DAO vorhanden ist, der nicht unter einer @Transactional-Annotation ausgeführt wird. Dies kann leicht passieren, wenn Sie die Transaktionsverwaltung auf Controller-Ebene konfiguriert haben, aber DAOs in einem Zeitgeber aufrufen oder @ PostConstruct-Anmerkungen verwenden. Ich habe es hier aufgeschrieben http://georgovassilis.blogspot.nl/2014/01/Tomcat-spring-and-memory-leaks-when.html

Edit: Es sieht so aus, als wäre dies (auch?) Ein Fehler mit spring-data-jpa, der mit v1.4.3 behoben wurde. Ich habe es in den Spring-Data-JPA-Quellen von LockModeRepositoryPostProcessor nachgeschlagen, in dem der Schlüssel "Transactional Resources" festgelegt ist. In 1.4.3 wird auch der Schlüssel wieder gelöscht.

Manchmal hat dies mit Konfigurationsänderungen zu tun. Bei einem Upgrade von Tomncat 6.0.14 auf 6.0.26 hatten wir etwas Ähnliches gesehen. Hier ist die Lösung http://www.skill-guru.com/blog/2010/08/22/Tomcat-6-0-26-shutdown-reports-a-web-application-created-a -threadlocal-threadlocal-wurde zwangsweise entfernt/

1
vsingh

Dieses Problem tritt auf, wenn wir Lösungen von Drittanbietern verwenden, ohne die Handler für die Bereinigungsaktivität zu verwenden. Für mich geschah dies für EhCache. Wir haben EhCache in unserem Projekt für das Caching verwendet. Und oft haben wir folgende Fehler in den Protokollen gesehen

 SEVERE: The web application [/products] appears to have started a thread named [products_default_cache_configuration] but has failed to stop it. This is very likely to create a memory leak.
Aug 07, 2017 11:08:36 AM org.Apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/products] appears to have started a thread named [Statistics Thread-products_default_cache_configuration-1] but has failed to stop it. This is very likely to create a memory leak.

Wir haben oft festgestellt, dass Tomcat während der Entwicklung einen Fehler für den OutOfMemory-Fehler hatte, bei dem wir Backend-Änderungen vorgenommen und die Anwendung mehrmals implementiert haben, um unsere Änderungen zu berücksichtigen.

Dies ist der Fix, den wir gemacht haben

<listener>
  <listener-class>
     net.sf.ehcache.constructs.web.ShutdownListener
  </listener-class>
</listener>

Ich versuche also, die Dokumentation der von Ihnen verwendeten Drittanbieter-Bibliotheken zu überprüfen. Sie sollten einige Mechanismen bereitstellen, um die Threads während des Herunterfahrens zu bereinigen. Was Sie in Ihrer Anwendung verwenden müssen ... Das Rad muss nicht neu erfunden werden, es sei denn, es wird nicht von ihnen bereitgestellt. Der schlimmste Fall ist die Bereitstellung Ihrer eigenen Implementierung.

Referenz für EHCache Shutdown http://www.ehcache.org/documentation/2.8/operations/shutdown.html

0
Sanjay Bharwani