[英]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.