当前位置: 首页 > 面试题库 >

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

莫河
2023-03-14
问题内容

我有一个Tomcat 7在Linux中运行的操作系统,可以$CATALINA_HOME/bin/startup.sh通过$CATALINA_HOME/bin/shutdown.sh
来启动和关闭/etc/init.d

除了1个问题,其他都还可以。有时tomcat不会停止。
尽管我停止了它,并且在catalina.out日志中看到了正在下降的日志,但是如果我这样做,ps -ef仍然可以看到该进程正在运行。

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

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

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

严重:Web应用程序[/ MyApplication]似乎已启动
名为[H2 File Lock Watchdog
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] 的线程,但
未能停止。这很可能造成内存泄漏。
2012年4月2 日,上午9:08:08 org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads严重:Web应用程序[/ MyApplication]
似乎已启动名为[FileWatchdog]的线程,但未能
将其停止。这很可能造成内存泄漏。

有什么帮助吗?我如何在这里发现问题?

更新:
kill -3按照@daveb的建议进行了操作,在catalina.out中,我看到了:

JVMDUMP006I正在处理转储事件“用户”,详细信息“”-请稍候。JVMDUMP032I
JVM使用’/etc/init.d/javacore.20120402.093922.2568.0001.txt’请求Java转储,以响应事件JVMDUMP010I
Java转储写入/etc/init.d/javacore.20120402.093922.2568.0001.txt
JVMDUMP013I处理的转储事件“用户”,详细信息“”。

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


问题答案:

如果Web应用程序已停止,则所有与数据库的连接也应关闭。如果没有连接列表,请执行SQL语句“ shutdown”(仅适用于H2和HSQLDB数据库)。

如果您已注册Servlet,则可以在Servlet.destroy()方法中执行此操作。

如果已经注册了ServletContextListener,则可以在该ServletContextListener.contextDestroyed(ServletContextEvent servletContextEvent)方法中执行“关闭”语句。这就是org.h2.server.web.DbStarter
ServletContextListener功能(H2数据库中包含的功能)。



 类似资料:
  • 问题内容: 我可以使用成功启动,文档中提到可以正常退出应用程序hit ctrl-c。 Maven进程确实终止了,但是Tomcat仍在运行,我仍然可以访问该网页。当我再次尝试启动spring-boot时,由于端口正在使用中,因此无法启动Tomcat。 要继续,我必须手动终止正在运行的进程。这是一个错误还是我错过了什么? 问题答案: 我仍然在Windows 7上运行的1.1.9版本上碰巧。 因此,在按

  • 要继续,我必须手动终止正在运行的进程。这是一个窃听器还是我遗漏了什么?

  • 我有一个类,,并用注释它。 我在该类中有两个方法: 我看到,当它应该打印它们中的内容时,它会打印出来,但当我在intelij中按一次停止按钮时,我会得到: 我需要再按一次停止按钮才能完全停止。 为什么即使到达也不关闭ExecutorService?我做错了什么? PS:这是我唯一的ExecutorService,没有其他线程是我做的。 停止按钮是intelij IDEA中play和debug按钮附

  • 问题内容: 我正在尝试使用Linux下的ProcessBuilder类将mp3文件解码为wav文件。由于某些原因,该过程不会停止,因此我必须手动取消它。 有人可以给我一个提示。我认为引用的代码很容易重现: jstack的输出 问题答案: 您需要清空进程的输出(通过)和错误(通过)流,否则可能会阻塞。 引用过程文档: 由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的

  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • 问题内容: 我正在尝试拍摄JUnit。在源代码中,我在两个位置设置了断点:1)在初始化静态成员的行中2)在一个测试用例的第一行中。 调试器在静态字段初始化行中停止。但这并不会在测试用例中停止。无论我在测试用例中的何处设置断点,调试器都不会在那里停下来。我肯定知道测试用例已执行,因为我可以看到添加的日志消息出现在日志中。 任何帮助将不胜感激。 我正在使用Eclipse Galileo和JUnit4启