java - Tomcat 不会停止。我该如何调试呢?

标签 java linux multithreading tomcat h2

我有一个在 Linux 中运行的 Tomcat 7,我通过 $CATALINA_HOME/bin/startup.sh 启动并通过 $CATALINA_HOME/bin/shutdown 关闭。嘘
来自 /etc/init.d

除 1 个问题外,一切正常。有时tomcat不会停止。
虽然我停止了它并且我在 catalina.out 日志中看到正在下降,但如果我这样做 ps -ef 我仍然可以看到进程正在运行。

可能是什么问题?我该如何调试呢?我的感觉是,这与线程有关。

所以可疑的部分如下:
1)我使用 Log4j 的 LogManager 来检测 log4j 配置是否已更改,但我在 contextDestroyed ServletContextListener
Log4jManager.shutdown > 2)我使用 H2 数据库,我在关机时看到:

SEVERE: The web application [/MyApplication] appears to have started a
thread named [H2 Log Writer MYAPPLICATION] but has failed to stop it.
This is very likely to create a memory leak

SEVERE: The web application [/MyApplication] appears to have started a
thread named [H2 File Lock Watchdog
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] but has
failed to stop it. This is very likely to create a memory leak. Apr 2,
2012 9:08:08 AM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads SEVERE: The web application [/MyApplication]
appears to have started a thread named [FileWatchdog] but has failed
to stop it. This is very likely to create a memory leak.

有什么帮助吗?我怎样才能发现这里的问题?

更新:
我按照@daveb 的建议做了一个 kill -3 ,在 catalina.out 中我看到:

JVMDUMP006I Processing dump event "user", detail "" - please wait. JVMDUMP032I JVM requested Java dump using '/etc/init.d/javacore.20120402.093922.2568.0001.txt' in response to an event JVMDUMP010I Java dump written to /etc/init.d/javacore.20120402.093922.2568.0001.txt JVMDUMP013I Processed dump event "user", detail "".

/etc/init.d 中有一个 javacore,但我不知道如何处理它。 IE。我应该调查哪些部分

最佳答案

通过使用 jstack 或向进程发送信号,找出哪些线程仍在运行(或阻塞、等待运行):

kill -3 pid

当您知道这一点时,您可以将启动它们的任何东西挂接到关闭通知中以停止线程。或者让这些线程成为守护线程。

This tomcat shutdown question了解更多详情。

如果您不知道线程是在哪里创建的,请考虑为它们添加名称 - 执行程序可以采用线程工厂,您可以使用这些工厂来设置线程的守护进程状态并为其命名 - 这样您的堆栈跟踪会更清晰。

关于java - Tomcat 不会停止。我该如何调试呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971876/

相关文章:

java - windows azure java客户端调用RESTFUL API

java - Java通信中C客户端中的TCP服务器

java - 如何使用 CloudCode 在createdAt一天后从自定义类中删除行

ruby-on-rails - 终结者找不到 Rails

Java - 检查端口是否正在使用而不连接到它

java - 警报对话框未显示

java - 无法使用 jconsole 连接到 JMX 远程

c -/usr/include/unistd.h 和 limit.h 来自 glibc 或内核

java - 如果在经典单例模式(如果有的话)中使用最终实例有什么好处呢?

python - numpy/scipy 中的哪些操作是多线程的?