最近換了筆記本,新的工作環境下jmap命令居然在報錯,而jps、jstat、jinfo、jstack都能正常使用,所以初步排除進程號的問題。
Attaching to core 17536 from executable heap, please wait...
Error attaching to core file: Windbg Error: OpenDumpFile failed!
sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: OpenDumpFile failed!
at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach0(Native Method)
at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach(WindbgDebuggerLocal.java:160)
at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
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:156)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
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)
同時,又試了下jmap heap xxx
一個不存在的進程號(這里先埋個坑),還是報同樣的錯誤,根據異常棧的信息,懷疑是Windows下的命令行沒有管理員權限,無法訪問dump文件,所以試了下以管理員運行CMD,然后jmap heap,然而還是報同樣的錯:

這下無助了,百度、stackoverflow逛了一圈也沒找到解決問題的辦法.....先放一放?
華麗麗的分隔線
大概過了不知道多久,猛地想起來 - - “是不是命令沒敲對?”,jmap -h
走一波,仔細看截圖中紅框內容,然后羞愧的低下了頭(一定是中秋月餅吃多了才導致的,嗯!)
如圖jmap有三種用法,1、連接正在運行的進程 2、分析core文件,即dump文件 3、連接其他機器的JVM進程所以,上面jmap heap xxx
命令的問題就出在搞忘記加 " - " 了,被jmap當作是要分析 “heap” 這個快照文件了,報錯也就理所應當了。
總結:
JDK自帶的工具包中,像jps、jmap、jstack等這些命令,指定option
一般都是要帶 “ - ” 的,而緊跟的參數是不帶杠的,這點需要牢記。還有就是報異常了不要慌,一定要仔細讀異常提示信息和異常棧,拿本例來說,其實第一行已經提示清楚了(小小吐槽下:要是把文件名也打印出來就更好了)