【发布时间】:2012-04-15 20:16:15
【问题描述】:
我有一个在 Linux 中运行的Tomcat 7,我通过$CATALINA_HOME/bin/startup.sh 启动并通过$CATALINA_HOME/bin/shutdown.sh 关闭
来自/etc/init.d
除 1 个问题外,一切正常。有时tomcat不会停止。
虽然我停止了它并且我在 catalina.out 日志中看到它正在下降,但如果我这样做 ps -ef 我仍然可以看到进程正在运行。
可能是什么问题?我该如何调试呢?我的感觉是,这与线程有关。
所以可疑的部分如下:
1) 我使用 Log4j 的 LogManager 来检测 log4j 配置是否已更改,但我在 contextDestroyed ServletContextListener 上执行 Log4jManager.shutdown
2)我使用H2数据库,我在关机时看到:
严重:Web 应用程序 [/MyApplication] 似乎已启动一个
名为 [H2 Log Writer MYAPPLICATION] 的线程,但未能阻止它。
这很可能会造成内存泄漏严重:Web 应用程序 [/MyApplication] 似乎已启动一个
线程名为 [H2 File Lock Watchdog
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] 但有
未能阻止它。这很可能造成内存泄漏。 4 月 2 日,
2012 上午 9:08:08 org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads 严重:Web 应用程序 [/MyApplication]
似乎已经启动了一个名为 [FileWatchdog] 的线程,但失败了
阻止它。这很可能造成内存泄漏。
有什么帮助吗?我怎样才能发现这里的问题?
更新:
我按照@daveb 的建议做了一个kill -3,在catalina.out 中我看到了:
JVMDUMP006I 正在处理转储事件“用户”,详细信息“” - 请稍候。 JVMDUMP032I JVM 请求 Java 转储,使用 '/etc/init.d/javacore.20120402.093922.2568.0001.txt' 响应 事件 JVMDUMP010I Java 转储写入 /etc/init.d/javacore.20120402.093922.2568.0001.txt JVMDUMP013I 已处理转储事件“用户”,详细信息“”。
/etc/init.d 中有一个 javacore,但我不知道如何处理它。 IE。我应该调查哪些部分
【问题讨论】:
-
尝试将您的线程标记为守护线程,这样虚拟机就不会等待它们死亡。 docs.oracle.com/javase/6/docs/api/java/lang/… 当然,这只对你自己的线程有用,对H2启动的线程没有用
-
H2 只创建守护线程。
-
@ThomasMueller:那么
SEVERE: The web application [/MYAPPLICATION] appears to have started a thread named [H2 File Lock Watchdog /opt/myOrg/tomcat/webapps/MyApplication/lock.db] but has failed to stop it. This is very likely to create a memory leak.在 catalina.out 中是什么意思?我没有创建这个,而是H2。 -
@ThomasMuller:我在您的 Google 群组中添加了一个帖子。它说它正在审核中。由于我的错误,我没有添加与 Tomcat 开发人员讨论的链接:mail-archives.apache.org/mod_mbox/tomcat-users/201204.mbox/…不过我会更新的
-
@ThomasMueller:这里还有mail-archives.apache.org/mod_mbox/tomcat-users/201204.mbox/…
标签: java linux multithreading tomcat h2