生活随笔
收集整理的這篇文章主要介紹了
Tomcat无法shutdown进程问题解决办法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉:http://blog.csdn.net/yydcj/article/details/8482916
我自己平時處理是: ps 獲取這個服務的進程號,全部kill掉,再sh startup.sh 啟動進程并確認啟動成功
1 問題現象
執行shutdown.sh之后,Web已經無法訪問:
Tomcat關聯java進程仍然存活:
?
[html]?view plaincopy
#/home/apache-tomcat-7.0.34/bin/shutdown.sh??Using?CATALINA_BASE:???/home/apache-tomcat-7.0.34??Using?CATALINA_HOME:???/home/apache-tomcat-7.0.34??Using?CATALINA_TMPDIR:?/home/apache-tomcat-7.0.34/temp??Using?JRE_HOME:????????/home/jdk1.6.0_34??Using?CLASSPATH:???????/home/apache-tomcat-7.0.34/bin/bootstrap.jar:/home/apache-tomcat-7.0.34/bin/tomcat-juli.jar??#?ps?aux?|?grep?'java.*tomcat'?|?grep?-v?grep??root?????22465?15.3??8.6?1294300?346264?pts/0??Sl???14:55???1:08?/home/jdk1.6.0_34/bin/java?-Djava.util.logging.config.file=/home/apache-tomcat-7.0.34/conf/logging.properties?-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager?-Djava.endorsed.dirs=/home/apache-tomcat-7.0.34/endorsed?-classpath?/home/apache-tomcat-7.0.34/bin/bootstrap.jar:/home/apache-tomcat-7.0.34/bin/tomcat-juli.jar?-Dcatalina.base=/home/apache-tomcat-7.0.34?-Dcatalina.home=/home/apache-tomcat-7.0.34?-Djava.io.tmpdir=/home/apache-tomcat-7.0.34/temp?org.apache.catalina.startup.Bootstrap?start?? 2013-1-8 15:02:53 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbccatalina.out報內存泄露警告:
?
?
[html]?view plaincopy
嚴重:?The?web?application?[]?registered?the?JDBC?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.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Thread-2]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[thread-snatch-picture]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-0]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-1]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-2]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-3]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-4]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-5]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-6]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Xmemcached-Reactor-7]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Heal-Session-Thread]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[pool-2-thread-1]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[pool-2-thread-2]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[pool-2-thread-3]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[pool-2-thread-4]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[Timer-0]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads??嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[MySQL?Statement?Cancellation?Timer]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?checkThreadLocalMapForLeaks??嚴重:?The?web?application?[]?created?a?ThreadLocal?with?key?of?type?[com.opensymphony.xwork2.inject.ContainerImpl$10]?(value?[com.opensymphony.xwork2.inject.ContainerImpl$10@b6c562])?and?a?value?of?type?[java.lang.Object[]]?(value?[[Ljava.lang.Object;@1d97383])?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.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?checkThreadLocalMapForLeaks??嚴重:?The?web?application?[]?created?a?ThreadLocal?with?key?of?type?[com.opensymphony.xwork2.inject.ContainerImpl$10]?(value?[com.opensymphony.xwork2.inject.ContainerImpl$10@b6c562])?and?a?value?of?type?[java.lang.Object[]]?(value?[[Ljava.lang.Object;@9a827])?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.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?checkThreadLocalMapForLeaks??嚴重:?The?web?application?[]?created?a?ThreadLocal?with?key?of?type?[com.opensymphony.xwork2.inject.ContainerImpl$10]?(value?[com.opensymphony.xwork2.inject.ContainerImpl$10@b6c562])?and?a?value?of?type?[java.lang.Object[]]?(value?[[Ljava.lang.Object;@12e71f1])?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.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?checkThreadLocalMapForLeaks??嚴重:?The?web?application?[]?created?a?ThreadLocal?with?key?of?type?[com.opensymphony.xwork2.inject.ContainerImpl$10]?(value?[com.opensymphony.xwork2.inject.ContainerImpl$10@b6c562])?and?a?value?of?type?[java.lang.Object[]]?(value?[[Ljava.lang.Object;@855793])?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.??2013-1-8?15:02:53?org.apache.catalina.loader.WebappClassLoader?checkThreadLocalMapForLeaks??嚴重:?The?web?application?[]?created?a?ThreadLocal?with?key?of?type?[com.opensymphony.xwork2.inject.ContainerImpl$10]?(value?[com.opensymphony.xwork2.inject.ContainerImpl$10@b6c562])?and?a?value?of?type?[java.lang.Object[]]?(value?[[Ljava.lang.Object;@5164df])?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.?? ?
2 問題分析
?
這個在windows下沒有碰到過,因為此前跑Tomcat都是以服務而不是命令腳本的形式跑的,而且已經換了一個項目,所以暫時不考察windows下是否存在該問題。
難道是Tomcat版本問題?或者用帶內存泄漏保護的Tomcat 7可以解決該問題?嘗試將web應用跑在apache-tomcat-6.0.18、apache-tomcat-6.0.35、apache-tomcat-7.0.34,發現均存在無法shutdown.sh進程問題。
難道在CentOS(Linux)下,Tomcat無法用shutdown.sh停掉進程?顯然不可能的。于是又把web應用從webapps中移走,換回tomcat自帶的ROOT,果然啟動后再shutdown.sh,查找不到原來的tomcat進程了,也就證明了是自己web應用的問題了。
3 解決方案
現在已經確定是web應用的問題了,所以可以提解決方案了。
3.1 Kill進程
忽略日志中的嚴重警告,因為這是關閉tomcat時候引起的,正常情況下不會發生這種內存泄露情況,而且Tomcat6.18以上版本的Tomcat已經做了內存泄露保護,交給Tomcat完成吧,我們只需要在shutdown.sh之后,補上一個kill -9 pid即可。要是嫌這樣太麻煩了,可以如下這樣改:
?
[html]?view plaincopy
==============================bin/shutdown.sh???exec?"$PRGDIR"/"$EXECUTABLE"?stop??-force?"$@"??#加上?-force???????==============================bin/catalina.sh????在PRGDIR=`dirname?"$PRG"`后面加上??if?[?-z?"$CATALINA_PID"?];?then????????CATALINA_PID=$PRGDIR/CATALINA_PID????????cat?$CATALINA_PID??fi?? ?
?
3.2 web應用中關閉后臺線程
shutdown.sh后存在tomcat僵尸進程的原因是shutdown.sh后web應用沒有去關閉其啟用的后臺線程,所以處理的辦法是監聽到tomcat關閉事件時,關閉掉其啟用的后臺線程。
Pstree? -p pid打印進程的線程樹,查看shutdown.sh后未關閉的后臺線程:
通過Java VisualVM查看shutdown.sh后未關閉的活動線程
?
在web應用中,如果有后臺線程,這時用shutdown.sh是關閉不掉Tomcat的。我們需要重寫相關的ServletContextListener的contextDestroyed(ServletContextEventarg0)方法,在它里面關閉后臺線程。
但是,現在很多web應用都是由spring來管理bean的,實際情況下我們可能需要注入很多第三方jar中的bean。比如在applicationContext.xml中配置如下bean:
<bean id ="dataSource" class ="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
則在org.apache.commons.dbcp.BasicDataSource需要做好銷毀數據庫線程池的邏輯。
當然我們也可以自己設置銷毀邏輯。在web.xml文件中增加監聽器。
?
[html]?view plaincopy
<listener>??????<listener-class>com.mysite.MySpecialListener</listener-class>??</listener>?? MySpecialListener實現如下:
?
?
[html]?view plaincopy
public?class?MySpecialListener?extends?ApplicationContextListener?{??????@Override??????public?void?contextInitialized(ServletContextEvent?sce)?{??????????//?On?Application?Startup,?please…??????????//?Usually?I'll?make?a?singleton?in?here,?set?up?my?pool,?etc.??????}??????@Override??????public?void?contextDestroyed(ServletContextEvent?sce)?{??????????//?On?Application?Shutdown,?please…??????????//?1.?Go?fetch?that?DataSource??????????Context?initContext?=?new?InitialContext();??????????Context?envContext??=?(Context)initContext.lookup("java:/comp/env");??????????DataSource?datasource?=?(DataSource)envContext.lookup("jdbc/database");??????????//?2.?Call?the?close()?method?on?it??????????datasource.close();??????????//?3.?Deregister?Driver??????????try?{??????????????java.sql.Driver?mySqlDriver?=?DriverManager.getDriver("jdbc:mysql://localhost:3306/");??????????????DriverManager.deregisterDriver(mySqlDriver);??????????}?catch?(SQLException?ex)?{??????????????logger.info("Could?not?deregister?driver:".concat(ex.getMessage()));??????????}???????????dataSource?=?null;??????}??}?? ?
轉載于:https://www.cnblogs.com/hnucdj/p/4712828.html
總結
以上是生活随笔為你收集整理的Tomcat无法shutdown进程问题解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。