Windows 使用jmap: Error attaching to process: Windbg Error: GetModuleParameters failed!

本文介绍了一种在使用Eclipse启动web工程时遇到的jmap与进程ID(PID)不兼容的问题,并提供了详细的解决方案。通过将工程打包成.jar文件并使用java-jar命令运行,再结合jps查询PID,最后使用jmapPID成功获取堆内存信息。

1.使用开发工具Eclipse启动web工程,使用jmap PID 报错。

C:\Users\Lenovo>jps
15760 RemoteMavenServer36
19312
16228 jar
17876 KotlinCompileDaemon
17908 Launcher
10360 jar
10044 Main
13052 KotlinCompileDaemon
18860 Jps

C:\Users\Lenovo>jmap 10360
Attaching to process ID 10360, please wait...
Error attaching to process: Windbg Error: GetModuleParameters failed!
sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: GetModuleParameters failed!
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach0(Native Method)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach(WindbgDebuggerLocal.java:152)
        at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671)
        at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:569)
        at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jmap.JMap.runTool(JMap.java:201)
        at sun.tools.jmap.JMap.main(JMap.java:130)

解决方法:
1.将运行在Eclipse,Idea。打包成.jar文件
2.使用java -jar xxxx.jar 运行程序
3.jps 查询java进程获取 PID
4.jmap PID

C:\Users\Lenovo>jmap -heap 10360
Attaching to process ID 16228, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 268435456 (256.0MB)
   NewSize                  = 5570560 (5.3125MB)
   MaxNewSize               = 89456640 (85.3125MB)
   OldSize                  = 11206656 (10.6875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 12582912 (12.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 4294901760 (4095.9375MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 5373952 (5.125MB)
   used     = 4152464 (3.9600982666015625MB)
   free     = 1221488 (1.1649017333984375MB)
   77.2702100800305% used
Eden Space:
   capacity = 4784128 (4.5625MB)
   used     = 3689400 (3.5184860229492188MB)
   free     = 1094728 (1.0440139770507812MB)
   77.11750187285959% used
From Space:
   capacity = 589824 (0.5625MB)
   used     = 463064 (0.44161224365234375MB)
   free     = 126760 (0.12088775634765625MB)
   78.50884331597223% used
To Space:
   capacity = 589824 (0.5625MB)
   used     = 0 (0.0MB)
   free     = 589824 (0.5625MB)
   0.0% used
tenured generation:
   capacity = 11833344 (11.28515625MB)
   used     = 10479408 (9.993942260742188MB)
   free     = 1353936 (1.2912139892578125MB)
   88.55829763759087% used

12037 interned Strings occupying 947544 bytes.

原因:
服务启动的jdk和jmap -heap时使用的jdk对应不上(一个是32位,一个是64位

在尝试附加到 Java 进程时遇到错误提示 `Error: no available Java process to attach`,通常表明工具无法找到可附加的 Java 进程。以下是一些可能的原因和解决方法: 1. **确认目标 Java 进程正在运行** 使用命令行工具(如 `jps`)列出当前系统中所有 Java 进程: ```bash jps -l ``` 该命令会显示所有正在运行的 Java 进程及其进程 ID (PID)。确保你希望附加的 Java 进程确实处于运行状态。 2. **检查权限问题** 如果使用某些需要较高权限的调试工具(如 `jdb` 或 `jvisualvm`),请确保用户账户具有足够的权限来访问目标进程。在某些操作系统上,这可能需要以管理员或 root 身份运行工具。 3. **确保工具与 Java 版本兼容** 不同版本的 JDK 提供的诊断工具可能会有所差异,特别是当目标 Java 应用程序运行在较旧版本的 JVM 上时(例如 JDK 7)。例如,在 Solaris 系统上,`pstack` 实用程序在 Solaris 10 之前不支持 Java 语言调试,仅能显示十六进制地址 [^1]。因此,请确保使用的调试工具与目标 JVM 兼容。 4. **使用 `jstatd` 启动远程监控服务** 如果是远程附加场景,可以考虑启动 `jstatd` 工具以提供 RMI 接口用于监控 JVM 状态。同时,确保配置了正确的安全策略文件,例如 `jstatd.all.policy` 文件内容如下: ```java grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; ``` 启动命令为: ```bash jstatd -J-Djava.security.policy=jstatd.all.policy ``` 这将允许远程连接并识别 Java 进程 [^2]。 5. **使用其他调试工具进行排查** 如果标准工具无法识别 Java 进程,可以尝试使用其他 JVM 自带的诊断工具,如 `jinfo`、`jstack`、`jmap` 等,并指定 PID 来获取更多关于目标进程的信息。例如: ```bash jstack <pid> ``` 6. **检查是否因操作系统限制导致问题** 在某些操作系统或容器环境中,可能存在对进程访问的限制。例如,Linux 的命名空间隔离可能导致调试器无法看到目标 Java 进程。在这种情况下,可以尝试进入相应的命名空间或调整环境设置。 7. **使用 `attach` API 编写自定义工具** 如果上述方法均无效,可以考虑通过 JVM 提供的 `com.sun.tools.attach` API 编写自定义程序来动态附加到 Java 进程并执行诊断操作。 ### 总结 出现 `no available Java process to attach` 错误的主要原因包括目标进程未运行、权限不足、工具版本不兼容、或操作系统限制等。通过检查 Java 进程状态、使用合适的调试工具以及调整配置,通常可以解决这一问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值