雄猫不会停止。如何调试它?

2022-09-01 05:22:52

我有一个在Linux中运行,我通过启动和关闭从
Tomcat 7$CATALINA_HOME/bin/startup.sh$CATALINA_HOME/bin/shutdown.sh/etc/init.d

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

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

因此,可疑的部分如下:
1)我使用Log4j的LogManager来检测log4j配置是否已更改,但我在
2)我使用数据库并在关闭时看到:Log4jManager.shutdowncontextDestroyedServletContextListenerH2

严重:Web 应用程序 [/MyApplication] 似乎启动了一
个名为 [H2 Log Writer MYAPPLICATION] 的线程,但未能阻止它。
这很可能会造成内存泄漏

严重:Web 应用程序 [/MyApplication] 似乎启动了一
个名为 [H2 File Lock Watchdog
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] 的线程,但
未能阻止它。这很可能会造成内存泄漏。Apr 2,
2012 9:08:08 AM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads SEVERE: Web 应用程序 [/MyApplication]
似乎启动了一个名为 [FileWatchdog] 的线程,但未能
停止它。这很可能会造成内存泄漏。

请帮忙吗?如何检测到此处的问题?

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

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 处理的转储事件“user”, detail “”。.

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


答案 1

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

kill -3 pid

当您知道这一点时,您可以使启动它们的任何内容挂钩到关闭通知中以停止线程。或者让这些线程成为 deamon 线程。

有关此详细信息,请参阅此 tomcat 关闭问题

如果您不知道线程的创建位置,请考虑向它们添加名称 - 执行程序可以采用线程工厂,您可以使用这些工厂来设置线程的deamon状态并对其进行命名 - 因此您的堆栈跟踪将更清晰。


答案 2

检查您的 Web 应用程序是否处于活动状态,如 Quartz。

如果不停止它,Web 应用程序线程永远不会结束,直到你杀死它