昨天在公司群里看到有人讨论这个问题,具体场景是这样的:
在远程debug的过程中,stop process后再重新执行远程debug,有一定几率会导致请求被hang住,进入不了断点。
有人给出了解释,原因是这样的:
一般IDE的 debug 底层使用的应该是jdi. jdi 需要跟目标jvm 上的jvmti agent建立连接。并且intellij跟jvmti agent的交互通过事件完成。目标jvm上有EventQueue 来管理 来自 intellij 的event 请求。一个目标jvm上有且仅有一个EventQueue 实例。 相同的event请求会放在一个叫做eventSet 的集合中。EventQueue 会把处理完的 eventSet 发送给intellij。
特别地,随着一次事件集的发送,目标虚拟机上可能会有一部分的线程因此而被挂起。如果一直不恢复这些线程,有可能会导致目标jvm挂机。因此,在处理好一个事件集中的事件后,一般IDE 会调用事件集的 resume() 方法,恢复所有可能被挂起的线程。 如果中途中断了IDE 的远程调试,可能就会影响目标jvm上的线程,所以导致再次调试断点就不生效了。
目前已知的办法是重启服务后可以恢复。
更多内容可以阅读:https://www.ibm.com/developerworks/cn/java/j-lo-jpda4/index.html?ca=drs-