java - 如何使用 VisualVM 或使用 unix 命令杀死 java 线程?

标签 java multithreading

我正在使用 Windows 7 操作系统。我的应用程序中有大约 6 个线程。为了测试警报以检查线程的健康状况,我需要手动终止线程并检查警报是否正常工作。我们可以像用 pid 杀死一个进程一样杀死一个线程吗?

最佳答案

Dan Woods 在此博客条目中记录了如何杀死线程... https://web.archive.org/web/20160302023213/http://www.rhcedan.com/2010/06/22/killing-a-java-thread 他执行的步骤涉及使用调试器 (JDB) 并在线程执行中注入(inject)异常。具体...

  1. 确保使用以下参数启动您的 java 程序:

    -Dcom.sun.management.jmxremote.port=50199
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    -Xrunjdwp:transport=dt_socket,address=50100,server=y,suspend=n

    这将允许我们将 java 调试器附加到正在运行的进程,之后 我们确定是哪个线程导致了问题。另外,请确保 你有你的 iptables 设置适当,以便只允许 来自您管理的主机/工作站的 50100 和 50199 连接。

  2. 找出有问题的线程:
  3. 杀死线程。在此示例中,ThreadName 为“btpool0-0?”。启动 java 调试器(也随 JDK 发行版一起提供),并附加到正在运行的 JVM……

    [root@host ~]# jdb -attach 50100

获取一个正在运行的线程列表——这也会给我们 JVM 看到的线程 ID:

> threads  
--snip--  
(org.mortbay.thread.BoundedThreadPool$PoolThread)0x25cb
btpool0-0 running  
--snip--

我们要杀死的线程 id 是“0x25cb”。杀死线程的第一步是跳进去,然后挂起……

thread 0x25cb
btpool0-0[1] suspend 0x25cb
btpool0-0[1] step
Step completed: <... snip ...>
btpool0-0[1] kill 0x25cb new java.lang.Exception()
killing thread: btpool0-0
btpool0-0[1] instance of 
com.site.package.name(name='btpool0-0', id=9675) killed btpool0-0[1]

退出java调试器,大功告成!

关于java - 如何使用 VisualVM 或使用 unix 命令杀死 java 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11610902/

相关文章:

java - 如何将 ":"殖民名称从 XML 转换为 XSD 架构?

java - Java 中的 USSD 菜单浏览器

java - 由于我没有使用所有服务,我可以降低 AWS 依赖项大小吗?

c - 在哪里加入多线程目录搜索?

C11 GCCthreads.h 未找到?

python - 队列和集合 Python 之间的区别

android - 在两次抽奖之间暂停

c# - 编写报告进度的方法

java - 多线程访问方法

java - 是否可以像JNDI一样在tomcat7中的context.xml中设置值和访问?