我有一个Tomcat 7
在我启动的 Linux 中运行$CATALINA_HOME/bin/startup.sh
并通过关闭$CATALINA_HOME/bin/shutdown.sh
from /etc/init.d
除了 1 个问题外,一切正常。有时tomcat不会停止。
虽然我停止了它并且我在 catalina.out 日志中看到它正在下降,如果我这样做的话ps -ef
我仍然可以看到该进程正在运行。
可能是什么问题呢?我该如何调试这个?我的感觉是,这与线程有关。
所以可疑的部分如下:
1)我使用Log4j的LogManager来检测log4j配置是否已更改,但我确实Log4jManager.shutdown
on a contextDestroyed
ServletContextListener
2)我用H2
数据库,我在关闭时看到:
严重:Web 应用程序 [/MyApplication] 似乎已启动
名为 [H2 Log Writer MYAPPLICATION] 的线程,但未能停止它。
这很可能造成内存泄漏
严重:Web 应用程序 [/MyApplication] 似乎已启动
线程名为 [H2 文件锁定看门狗
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] 但有
未能阻止它。这很可能造成内存泄漏。 4月2日,
2012 上午 9:08:08 org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads 严重:Web 应用程序 [/MyApplication]
似乎已启动名为 [FileWatchdog] 的线程但失败
阻止它。这很可能造成内存泄漏。
有什么帮助吗?我怎样才能检测到这里的问题?
UPDATE:
我做了一个kill -3
正如 @daveb 所建议的,在 catalina.out 中我看到:
JVMDUMP006I 正在处理转储事件“user”,详细信息“” - 请稍候。
JVMDUMP032I JVM 请求使用 Java 转储
'/etc/init.d/javacore.20120402.093922.2568.0001.txt' 响应
事件 JVMDUMP010I Java 转储写入
/etc/init.d/javacore.20120402.093922.2568.0001.txt JVMDUMP013I
已处理转储事件“用户”,详细信息“”。
里面有一个javacore/etc/init.d
但我不知道如何处理它。 IE。我应该调查哪些部分
通过使用 jstack 或向进程发送信号来找出哪些线程仍在运行(或阻塞、等待运行):
kill -3 pid
当您知道这一点时,您可以将启动它们的任何内容挂接到关闭通知中以停止线程。或者使这些线程成为守护线程。
See 这个tomcat关闭问题 https://stackoverflow.com/questions/8680465/should-threads-have-special-design-to-be-shutdown-gracefull-by-tomcat有关此的更多详细信息。
如果您不知道线程是在哪里创建的,那么请考虑向它们添加名称 - 执行程序可以采用线程工厂,并且您可以使用这些工厂来设置线程的守护进程状态并为其命名 - 这样您的堆栈跟踪将更清楚。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)