web-dev-qa-db-ja.com

これはTomcatでメモリリークを引き起こす可能性が非常に高いですか?

Tomcatを別の外部オープンソースで動作するように構成しました。

ただし、Tomcatが数分間実行された後、次のメッセージが表示されます。

重大:Webアプリケーション[/ MyProject]は、タイプ[Java.lang.ThreadLocal](値[Java.lang.ThreadLocal@1b3f02f])のキーとタイプ[org.Apache.axis.MessageContext]の値を持つThreadLocalを作成しました(値[org.Apache.axis.MessageContext@5dbd4e])が、Webアプリケーションの停止時に削除に失敗しました。これにより、メモリリークが発生する可能性が非常に高くなります。

何が原因ですか?

どこを見なければなりませんか? Tomcatでデータプーリングできますか?

そして、Tomcatのスレッドはどういう意味ですか?

[〜#〜]編集済み[〜#〜]

これが私の完全なトレースです。アプリケーションはまだ実行中にコンテキストをリロードするようです-なぜかわかりません!

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 [Java.lang.ThreadLocal@1b5a8e1]) and a value of type [org.mvel2.debug.DebuggerContext] (value [org.mvel2.debug.DebuggerContext@16259fd]) 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 [org.Apache.axis.utils.XMLUtils$ThreadLocalDocumentBuilder@84b0b4]) and a value of type [com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl] (value [com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl@16d2cfa]) 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 [com.Sun.faces.util.Util$1@16bbac9]) 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 [Java.lang.ThreadLocal@1b3f02f]) and a value of type [org.Apache.axis.MessageContext] (value [org.Apache.axis.MessageContext@5dbd4e]) 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 [org.Apache.axis.utils.XMLUtils$ThreadLocalDocumentBuilder@84b0b4]) and a value of type [com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl] (value [com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl@378584]) 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 [{org.hibernate.impl.SessionFactoryImpl@ccc27b=org.springframework.orm.hibernate3.SessionHolder@4f6ada}]) 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 [com.Sun.faces.application.ApplicationAssociate$1@1f01fcf]) and a value of type [com.Sun.faces.application.ApplicationAssociate] (value [com.Sun.faces.application.ApplicationAssociate@1b85528]) 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)
45
Dejell

メッセージは実際には非常に明確です:何かがThreadLocal型の値で作成しますorg.Apache.axis.MessageContext-これは素晴らしいヒントです。最も可能性が高いのは、Apache Axisフレームワーク自体のクリーンアップを忘れた/失敗したことを意味します。同じ 問題 がLogbackのインスタンスで発生しました。あまり気にする必要はありませんが、バグをAxisチームに報告することをお勧めします。

ThreadLocalsはHTTPワーカースレッドごとに作成されるため、Tomcatはこのエラーを報告します。アプリケーションはデプロイ解除されますが、HTTPスレッドは残ります-これらのThreadLocalsも同様です。これにより、メモリリーク(org.Apache.axis.MessageContextはアンロードできません)およびこれらのスレッドが将来再利用される際のいくつかの問題。

詳細については、以下を参照してください: http://wiki.Apache.org/Tomcat/MemoryLeakProtection

24

CDI @ApplicationScoped Beanの@PreDestroyメソッドに以下を追加し、TomEE 1.6.0(Tomcat7.0.39、今日)をシャットダウンすると、スレッドローカルがクリアされます。

/*
 * 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

キー「トランザクションリソース」は、適切なトランザクションなしでデータベースと通信しているように見えます。トランザクション管理が適切に構成され、@ Transactionalアノテーションの下で実行されないDAOへの呼び出しパスが存在しないことを確認してください。これは、コントローラーレベルでトランザクション管理を構成したが、タイマーでDAOを呼び出している場合、または@PostConstructアノテーションを使用している場合に簡単に発生します。ここに書きました http://georgovassilis.blogspot.nl/2014/01/Tomcat-spring-and-memory-leaks-when.html

編集:これは(また?)v1.4.3で修正されたspring-data-jpaのバグのようです。 「Transactional Resources」キーを設定するLockModeRepositoryPostProcessorのspring-data-jpaソースで調べました。 1.4.3では、キーも再びクリアされます。

これは、構成の変更に関係する場合があります。 Tomncat 6.0.14から6.0.26にアップグレードしたとき、同様の現象が見られました。ここに解決策があります http://www.skill-guru.com/blog/2010/08/22/Tomcat-6-0-26-shutdown-reports-a-web-application-created-a- threadlocal-threadlocal-has-been-forcibly-removed /

1
vsingh

この問題は、クリーンアップアクティビティのハンドラーを使用せずにサードパーティのソリューションを使用している場合に発生します。私にとって、これはEhCacheで起こっていました。プロジェクトでEhCacheをキャッシュに使用していました。多くの場合、ログに次のエラーが表示されていました

 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.

また、開発中にTomcatがOutOfMemoryエラーで失敗することがよくありました。これは、バックエンドの変更を行い、変更を反映するためにアプリケーションを複数回デプロイしていました。

これが修正です

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

したがって、私が作成しようとしているポイントは、使用しているサードパーティのライブラリのドキュメントを確認することです。シャットダウン中にスレッドをクリーンアップするメカニズムを提供する必要があります。アプリケーションで使用する必要があるもの。車輪が提供されない限り、車輪を再発明する必要はありません。最悪の場合は、独自の実装を提供することです。

EHCacheシャットダウンのリファレンス http://www.ehcache.org/documentation/2.8/operations/shutdown.html

0
Sanjay Bharwani