tomcat shutdown後清理工作出現的異常

引言

    tomcat屬於web應用服務器,當我們的應用服務器關閉後,但是有些java class/thread/threadLocal等依然存活,當再次reload後,就會導致內存的溢出.爲了避免這種嚴重的內存leak問題,tomcat做了一些內存溢出檢測.

server.xml

  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

    雖然tomcat做了這些檢測並試圖stop這些存活的引用,但是不是強制的,比如一些請求或線程,當應用關閉的時候,還在處理中,這時tomcat不會去關閉.這就需要tomcat強制關閉或依賴對應的框架來關閉.


項目中遇到類似問題

Q1:
    org.apache.catalina.loader.WebappClassLoaderclearReferencesJdbc
SEVERE:The web application [/myapp] registered the JDBC driver[com.mysql.jdbc.Driver] but failed to unregister it when the web applicationwas stopped. To prevent a memory leak, the JDBC Driver has been forciblyunregistered.
 
A1:
https://stackoverflow.com/questions/15632153/tomcat7-jdbc-datasource-this-is-very-likely-to-create-a-memory-leak
需要把項目中使用的jdbc驅動包放到tomcat/lib
 
 
Q2:
org.apache.catalina.loader.WebappClassLoaderclearReferencesThreads
SEVERE: The web application [/myapp] appears to have started athread named [Abandoned connection cleanup thread] but has failed to stop it.This is very likely to create a memory leak.
 
A2:
   https://stackoverflow.com/questions/24850091/the-web-application-registered-the-jdbc-driver-com-mysql-jdbc-driver-but-fa
 
 
Q3:
SEVERE:The web application [/myapp] appears to have started a thread named [MySQL StatementCancellation Timer] but has failed to stop it. This is very likely to create amemory leak.
 
A3:
https://stackoverflow.com/questions/10615118/how-to-solve-memory-leak-problems
  這是mysql jdbc 驅動包的一個BUG(SUNVM), https://bugs.mysql.com/bug.php?id=36565
  version 5.1.27之後的版本解決了這個問題.
 
 
Q4:
org.apache.catalina.loader.WebappClassLoadercheckThreadLocalMapForLeaks
SEVERE: The web application [/myapp] created a ThreadLocal with keyof type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@681f8054]) and avalue of type [com.alibaba.druid.wall.spi.WallVisitorUtils.WallTopStatementContext](value[com.alibaba.druid.wall.spi.WallVisitorUtils$WallTopStatementContext@117d5a14])but failed to remove it when the web application was stopped. Threads are goingto be renewed over time to try and avoid a probable memory leak.
 
A4:
    關閉druid的自帶監測功能.


tomcat 釋放引用的主要分類


1. org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc

  http://hongjiang.info/tomcat-jdbc-leak-prevention/

  https://stackoverflow.com/questions/15632153/tomcat7-jdbc-datasource-this-is-very-likely-to-create-a-memory-leak

 把JDBC driver放到tomcat/lib下,並刪除項目的jdbc driver.


2. org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

http://hongjiang.info/tomcat-clear-references-threads/



3. org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks

http://hongjiang.info/tomcat-clear-references-threadlocal/



4. clearReferencesRmiTargets



5.clearReferencesStaticFinal



6.clearReferencesResourceBundles


protected void clearReferences() {    // De-register any remaining JDBC drivers    clearReferencesJdbc();    // Stop any threads the web application started    clearReferencesThreads();    // Check for leaks triggered by ThreadLocals loaded by this class loader    checkThreadLocalsForLeaks();    // Clear RMI Targets loaded by this class loader    clearReferencesRmiTargets();    // Null out any static or final fields from loaded classes,    // as a workaround for apparent garbage collection bugs    if (clearReferencesStatic) {        clearReferencesStaticFinal();    }     // Clear the IntrospectionUtils cache.    IntrospectionUtils.clear();    // Clear the classloader reference in common-logging    if (clearReferencesLogFactoryRelease) {        org.apache.juli.logging.LogFactory.release(this);    }    // Clear the resource bundle cache    // This shouldn't be necessary, the cache uses weak references but    // it has caused leaks. Oddly, using the leak detection code in    // standard host allows the class loader to be GC'd. This has been seen    // on Sun but not IBM JREs. Maybe a bug in Sun's GC impl?    clearReferencesResourceBundles();    // Clear the classloader reference in the VM's bean introspector    java.beans.Introspector.flushCaches(); }


tomcat graceful shutdown

https://dzone.com/articles/tomcats-graceful-shutdown

http://www.captaindebug.com/2013/09/tomcats-graceful-shutdown-with-daemons.html#.Wdxh9ltL_IU





參考文檔:

http://hongjiang.info/tomcat-jdbc-leak-prevention/

http://hongjiang.info/tomcat-clear-references-threads/

http://hongjiang.info/tomcat-clear-references-threadlocal/

http://blog.csdn.net/will_awoke/article/details/38338519

http://www.cnblogs.com/lixiaojiao-hit/p/5095180.html




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章