簡體   English   中英

當連接到具有許多線程的遠程JVM時(即通過TCPIP傳輸線程調試信息),Java的JDB(和Eclipse)會掛起

[英]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上列出線程信息是不可接受的,並且可能是一個錯誤(或一個非常糟糕的實現功能)。

可能與?有關?

  1. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6401245 - 這看起來已修復,不應再是問題了。 此外,JVM在Windows Datacenter而非Linux上運行。
  2. http://www.eclipsecon.org/2013/comment/reply/1153.html - 可能的解決方案,但需要SAP JVM?
  3. https://github.com/vpotapev/jbreakpoint - 開源jdb接口,但不解決Eclipse的問題。

題。 有沒有人有任何想法如何使線程數據傳輸更高效,以便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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM