問題の説明
皆さんこんにちは、
今日、新しいサーバーへのリモート デバッグで問題が発生しました。最初は、Eclipse がリモート JVM に接続するのに時間がかかっているように見えました。しかし、いくつかの調査の後、私jdb
は同様の問題を抱えていることに気付きました。いくつかの掘り出し物がこれを見つけました...
リモート JVM への接続は問題ありません。どちらのデバッガーも、数秒以内にソケット接続を適切に確立します。jdb
コマンドも処理します。ただし、リモート デバッガが正常に接続した後、Sun Java 1.7.0_60-b19 JVM
スレッド デバッグ情報 (JVMTI/JDWP) を TCPIP 経由でネットワーク経由で送信するときに、 がハング (または送信が非常に遅く) しているように見えます。
リモート JVM のスレッドを一覧表示することが問題のようです。JDB のthreads
コマンドがハングするか、実行が非常に遅くなります。リモート JVM の負荷は妥当であり、ブレークポイントは設定されていません。この JVM では多くのスレッドが同時に実行されており (~2005 スレッド)、WAN の遅延が発生する可能性がありますが、それでもリモート デバッガーを正常に使用する方法が必要です!
観察。これは、マシンがWAN 上の地球の反対側にあるため、JVM の Java Debug Wire Protocol (JDWP) 実装による TCPIP を介した非効率的なスレッド情報の送信に関連していると推測しています。ただし、同じマシンへの Windows リモート デスクトップ接続は、許容できる速度とパフォーマンスを備えています。それを考えると、Eclipse を 45 分間待たなければならない、またはJDB
JVM のスレッド情報を一覧表示する必要があるのは受け入れられず、おそらくバグ (または非常に不十分に実装された機能) であると思われます。
もしかして関係?
- http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6401245 - これは修正されたようで、もう問題にはなりません。さらに、JVM は Linux ではなく Windows Datacenter で実行されています。
- http://www.eclipsecon.org/2013/comment/reply/1153.html - 可能な解決策ですが、SAP JVM が必要ですか?
- https://github.com/vpotapev/jbreakpoint - オープン ソースの jdb インターフェイスですが、Eclipse の問題は修正されていません。
質問。JVMを効果的にリモートデバッグできるように、スレッドデータの送信をより効率的にする方法を知っている人はいますか? これは JVM の Java Debugging Wire Protocol (JDWP) のバグですか?
問題の詳細
Java バージョン:
C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_60\bin\java" -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
アプリケーション・サーバー。Weblogic 10g で発生します。IBM WebSphere 8.5 でも発生
エクリプス。デバッグ ビューにスレッド情報を入力しようとすると、Eclipse リモート デバッグが無期限にハングします。
JDB - リモート。コマンドでスレッドを一覧表示すると、 Java のjdb
リモート デバッガーが 10 分以上ハングしますthread
。次に、それらを非常にゆっくりと一覧表示します (1 秒あたり 1 スレッド、すべてを一覧表示するには 33 分かかります)。
"C:\Program Files\Java\jdk1.7.0_60\bin\jdb.exe -connect com.sun.jdi.SocketAttach:hostname=xxx.yyy.com,port=7777
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> threads
Group system: <<jdb hangs here trying to get thread information>>
JDB - ローカル。Java のjdb
リモート デバッガーはthreads
、JVM のローカル マシンで実行すると、コマンドを 3 秒で実行します。
"C:\Program Files\Java\jdk1.7.0_60\bin\jdb.exe -connect com.sun.jdi.SocketAttach:hostname=xxx.yyy.com,port=7777
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> threads
Group system:
> threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x7484 Reference Handler
(java.lang.ref.Finalizer$FinalizerThread)0x7485 Finalizer
(java.lang.Thread)0x7486 ...
GC Daemon
(java.lang.Thread)0x748b RMI RenewClean-
...
>