当我们在应用程序日志中有线程名称时,如何识别在哪里启动线程的Java代码

问题描述 投票:3回答:2

我进入旧应用程序的日志下方,尝试使用.setName进行搜索,因为我们使用thread.setName方法设置了线程名称,但看不到它。我怀疑它是由应用程序启动的,我正在搜索所有.java文件。

Jan 30, 2014 1:00:29 AM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads SEVERE: The web application [/MyWebApp] appears
to have started a thread named [Control] but has failed to stop it.
This is very likely to create a mem ory leak. Jan 30, 2014 1:00:29 AM
org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/MyWebApp] appears to have started a
thread named [MultiThreadedHttpConnectionManager cleanup] but has
failed to stop it.

无法理解这些线程(Control和MultiThreadedHttpConnectionManager)从哪里开始,以便我可以修改代码以停止这些线程。

编辑:我的同事回答了其中一部分,MultiThreadedHttpConnectionManager在Axis2中为BUG

当我在调试模式下运行tomcat时,我看到一些守护程序线程和另外两个线程(main,Control)。控制线程的命令行参数显示“ org.apache.catalina.startup.Bootstrap启动”。看起来tomcat正在启动该线程,但是如果是这种情况,为什么tomcat会为此提供错误日志?

java multithreading tomcat6
2个回答
1
投票

我有我的答案和2个简单的解决方案,可以解决此问题

  1. 使用Kill -QUIT pid获取线程转储并查看堆栈跟踪,它提供堆栈跟踪并告诉您什么是可运行/线程类名字是。
  2. 另一个选择是在eclipse中启动应用程序,请参阅get来自调试模式的信息。在哪里可以看到所有线程正在运行。

0
投票

如果您的线程通过ThreadPoolExecutor::runWorker运行,则可以在条件task.run()上的wt.name.equals("my-thread-name")上放置一个条件断点,并进入创建该线程的代码。

© www.soinside.com 2019 - 2024. All rights reserved.