gpt4 book ai didi

java - BTrace 脚本杀死 Java 虚拟机线程

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:00 26 4
gpt4 key购买 nike

VisualVM 支持执行不安全的 BTrace 脚本 ( https://kenai.com/projects/btrace/pages/UserGuide )。是否可以使用不安全的 BTrace 脚本来终止/中断某些 Java 线程?我的 Eclipse IDE 中的某些线程陷入僵局,我想正常关闭 IDE。

"Worker-3571" prio=6 tid=0x00000000114b7800 nid=0x964 waiting for monitor entry [0x000000002a45f000] java.lang.Thread.State: BLOCKED (on object monitor) at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup$3.run(SelectionListenerWithASTManager.java:155) - waiting to lock <0x00000000f7490ce8> (a java.lang.Object) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

"Worker-3568" prio=6 tid=0x00000000114b9000 nid=0x2984 waiting for monitor entry [0x000000002958f000] java.lang.Thread.State: BLOCKED (on object monitor) at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup$3.run(SelectionListenerWithASTManager.java:155) - waiting to lock <0x00000000f7490ce8> (a java.lang.Object) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

"Worker-3570" prio=6 tid=0x00000000114bc000 nid=0x1980 in Object.wait() [0x000000002998f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:503) at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider.java:457) - locked <0x00000000e10979a0> (a java.lang.Object) at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:128) at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup.calculateASTandInform(SelectionListenerWithASTManager.java:170) at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup$3.run(SelectionListenerWithASTManager.java:155) - locked <0x00000000f7490ce8> (a java.lang.Object) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

最佳答案

不,由于以下原因无法执行此操作:

  1. BTrace 仅支持通过 Java API 提供的功能。没有 Java API 可以杀死任意线程。
  2. BTrace 使用类重新转换来注入(inject)其代码。即使类字节码被修改,当前堆栈上的所有方法仍会继续使用原始字节码,并且仅当它们离开堆栈时才会交换到新版本(返回,异常)。这意味着当您的线程卡住(尤其是等待/阻塞)时,您想要检测的方法将保留在堆栈中,并且永远不会应用新的字节码。

基于 JPDA 的解决方案(例如 jdb、youdebug)会让您更幸运

关于java - BTrace 脚本杀死 Java 虚拟机线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15911695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com