3

我正在尝试运行和调试来自 sun.jvm.hotspot.tools 和 sun.jvm.hotspot.utilities(如 JMap.java)的实用程序,以便更好地了解正在发生的事情。

不幸的是,我很早就遇到了以下错误消息,甚至没有进行很多调试:

Attaching to process ID 5144, please wait...
Error attaching to process: Timed out while attempting to connect to debug server (please start SwDbgSrv.exe)

似乎无论出于何种原因,这些工具都试图连接到在端口 27000 上运行的“调试服务器”。

在 sun.jvm.hotspot.tools.HeapDumer.java 的文档中,我发现了以下内容:

JDK jmap 实用程序使用此工具将目标进程/核心的堆转储为 HPROF 二进制文件。如果需要,它也可以用作独立工具。

所以我(也许天真地)假设 jmap.exe 以某种方式使用它,但我从未遇到过使用 jmap 创建堆转储的此类问题。我从来不需要先启动另一个进程。

有什么想法可以直接从我的开发环境运行所有这些工具吗?

谢谢

4

1 回答 1

2

sun.jvm.hotspot.*工具是HotSpot Serviceability Agent的一部分。

我假设您在 Windows 上使用 JDK 6,因为自 JDK 7 起不再需要调试服务器。在早期版本中,您必须启动SwDbgSrv.exe才能使用 Serviceability Agent。

一些内置的 JDK 实用程序(jmap、jstack)有两种执行模式:合作和强制。在正常协作模式下,这些工具使用动态附加机制连接到目标 VM。然后,目标 VM 从目标进程内直接执行请求的命令。

强制模式(jmap -F,jstack -F)的行为完全不同。该工具挂起目标进程,然后使用 Serviceability Agent 读取进程内存。该命令在目标 VM 暂停时在工具进程中执行。这就是sun.jvm.hotspot.*实用程序所做的。

于 2015-06-06T11:10:04.883 回答