问题描述
大家好,
我今天在远程调试到新服务器时遇到了问题,最初看起来 Eclipse 需要很长时间才能连接到远程 JVM。但是,经过一些调查,我意识到jdb
遇到了类似的问题。一些挖掘发现了这个...
连接到远程 JVM 不是问题。两个调试器都在几秒钟内正确建立套接字连接。 jdb
甚至可以处理命令。但是,在远程调试器成功连接到它之后,当通过 TCPIP 通过网络发送其线程调试信息 (JVMTI/JDWP( 时,Sun Java 1.7.0_60-b19 JVM
似乎挂起(或传输速度极慢(。
列出远程 JVM 的线程似乎是问题所在。JDB 的 threads
命令要么挂起,要么执行得非常慢。远程 JVM 上的负载是合理的,并且没有设置任何断点。有许多线程同时在此 JVM 上执行(~2005 个线程(,并且可能存在一些 WAN 延迟,但仍然需要一种方法来成功使用远程调试器!
观察。我猜这与JVM的Java调试线协议(JDWP(实现通过TCPIP低效地传输线程信息有关,因为机器在WAN上位于地球的另一端。但是 - Windows远程桌面连接到同一台计算机的速度和性能是可以接受的。鉴于此,似乎必须等待 45 分钟才能让 Eclipse 或 JDB
列出 JVM 上的线程信息是不可接受的,并且可能是一个错误(或实现得非常差的功能(。
可能与?
- http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6401245 - 这看起来它已修复,不应该再成为问题了。此外,JVM运行在Windows数据中心而不是Linux上。
- http://www.eclipsecon.org/2013/comment/reply/1153.html - 可能解决方案,但需要 SAP JVM?
- https://github.com/vpotapev/jbreakpoint - 开源 jdb 接口但不能解决 Eclipse 的问题。
问题。有没有人知道如何使线程数据传输更高效,以便可以有效地远程调试JVM?这是JVM的Java调试线协议(JDWP(中的错误吗?
问题详情
爪哇版本:
C:UsersAdministrator>"C:Program FilesJavajdk1.7.0_60binjava" -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
远程调试器在使用 thread
命令列出线程时会挂起 10 分钟以上。然后它非常缓慢地列出它们(每秒 1 个线程,需要 33 分钟才能将它们全部列出(。
"C:Program FilesJavajdk1.7.0_60binjdb.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
远程调试器在 JVM 的本地机器上运行时,在 3 秒内执行 threads
命令。
"C:Program FilesJavajdk1.7.0_60binjdb.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 调试代理添加线程过滤器功能,以便在发出每个代码步骤后仅将感兴趣的线程的信息传输到调试器。