雄猫并没有停止。我该如何调试这个?

2024-01-07

我有一个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(使用前将#替换为@)

雄猫并没有停止。我该如何调试这个? 的相关文章

随机推荐