2

私は JDI を使用していますが、com.sun.jdi.VirtualMachine#dispose の呼び出しが何らかの状況でハングすることがわかりました。

スレッド スタックは次のとおりです。

 "qtp1764345202-39" prio=5 tid=0x00007f830a14f000 nid=0x10d03 in Object.wait() [0x0000000128ea6000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007039b1f40> (a com.sun.tools.jdi.Packet)
        at java.lang.Object.wait(Object.java:503)
        at com.sun.tools.jdi.TargetVM.waitForReply(TargetVM.java:300)
        - locked <0x00000007039b1f40> (a com.sun.tools.jdi.Packet)
        at com.sun.tools.jdi.VirtualMachineImpl.waitForTargetReply(VirtualMachineImpl.java:1036)
        at com.sun.tools.jdi.PacketStream.waitForReply(PacketStream.java:69)
        at com.sun.tools.jdi.JDWP$VirtualMachine$Dispose.waitForReply(JDWP.java:445)
        at com.sun.tools.jdi.JDWP$VirtualMachine$Dispose.process(JDWP.java:431)
        at com.sun.tools.jdi.VirtualMachineImpl.dispose(VirtualMachineImpl.java:555)

逆コンパイルされたコードから、私はこれを見ました:

void waitForReply(Packet var1) {
    synchronized(var1) {
        while(!var1.replied && this.shouldListen) {
            try {
                var1.wait();
            } catch (InterruptedException var5) {
                ;
            }
        }

        if(!var1.replied) {
            throw new VMDisconnectedException();
        }
    }
}

ここでデッドロックが発生しているようですが、これは JDK のバグですか? Hotspot JDK 7 を使用しています。

Java バージョン "1.7.0_79" Java(TM) SE ランタイム環境 (ビルド 1.7.0_79-b15) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 24.79-b02、混合モード)

4

0 に答える 0