[英]Java's JDB (and Eclipse) hang when connecting to remote JVMs with many threads (i.e. transmitting thread debug information via TCPIP)
嗨,大家好,
我今天遠程調試到新服務器時遇到問題,最初看起來好像Eclipse需要很長時間才能連接到遠程JVM。 然而,經過一番調查后,我意識到jdb
遇到了類似的問題。 一些挖掘出現了......
連接到遠程JVM不是問題。 兩個調試器都會在幾秒鍾內正確建立套接字連接。 jdb
甚至處理命令。 但是,在遠程調試器成功連接到它之后,當通過TCPIP在網絡上發送其線程調試信息(JVMTI / JDWP)時, Sun Java 1.7.0_60-b19 JVM
似乎掛起(或傳輸速度非常慢)。
列出遠程JVM的線程似乎是個問題。 JDB的threads
命令要么掛起,要么執行得非常慢。 遠程JVM上的負載是合理的,並且沒有設置任何斷點。 在這個JVM上同時執行許多線程(~2005個線程),並且可能存在一些WAN延遲,但仍然需要有一種方法可以成功使用遠程調試器!
觀察。 我猜這是關系到通過TCPIP由JVM的Java調試線協議(JDWP)實現的線程信息傳遞效率低下,因為機器在這個星球的WAN上的另一側。 但是 - Windows遠程桌面連接到同一台機器是可以接受的快速和高性能。 鑒於此,似乎等待45分鍾讓Eclipse或JDB
在JVM上列出線程信息是不可接受的,並且可能是一個錯誤(或一個非常糟糕的實現功能)。
可能與?有關?
題。 有沒有人有任何想法如何使線程數據傳輸更高效,以便JVM可以有效地遠程調試? 這是JVM的Java調試線協議(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)
Application Server。 與Weblogic 10g一起發生。 IBM WebSphere 8.5也會發生這種情況
日食。 嘗試使用線程信息填充Debug視圖時,Eclipse遠程調試無限期掛起。
JDB - 遠程。 使用thread
命令列出線程時,Java的jdb
遠程調試器會掛起超過10分鍾。 然后它非常緩慢地列出它們(每秒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 - 本地。 當在JVM的本地計算機上運行時,Java的jdb
遠程調試器在3秒內執行threads
命令。
"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-
...
>
經過一些調查和數據包嗅探后,似乎遠程進程中有大量線程會導致調試數據包擁塞以及遠程進程調試代理和遠程調試器之間處理延遲的反饋循環。 基本上,JVM調試代理不是為高延遲連接而設計的,也不是為遠程調試大量線程而設計的。 它也不會嘗試壓縮線程/堆棧/變量更新信息以降低調試器的傳輸時間。
我們的解決方案最終是為我們的產品添加一個線程調試模式,減少了各種服務器線程池大小,然后調試突然在海外網絡上再次響應。
未來對Java社區的建議是向Eclipse和Java調試代理添加線程過濾器功能,以便在每個代碼步驟發出信號后,只將感興趣的線程的信息傳輸到調試器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.