彻底解决Jmap在mac版本无法使用的问题
看了网上很多帖子,都说一半,说的都是大家说过的,根本没有解决问题。说jdk8不行,换成jdk9或者jdk11,我都试了,还是不行,最后说是mac的问题。换成linux,崩溃!!!
一、在mac运行Jmap的问题
1. 我们运行jps查询刚刚启动的项目
然后执行Jmap查询堆内存使用情况
Jmap -heap 1518
执行后报错:
Attaching to process ID 1518, please wait... ERROR: attach: task_for_pid(1518) failed: '(os/kern) failure' (5) Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges. sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges. at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.execute(BsdDebuggerLocal.java:169) at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach(BsdDebuggerLocal.java:287) at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:671) at sun.jvm.hotspot.HotSpotAgent.setupDebuggerDarwin(HotSpotAgent.java:659) at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:341) 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.HeapSummary.main(HeapSummary.java:49) 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) Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges. at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach0(Native Method) at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.access$100(BsdDebuggerLocal.java:65) at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$1AttachTask.doit(BsdDebuggerLocal.java:278) at sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.run(BsdDebuggerLocal.java:144)
2. 百度这个异常
说mac环境jdk8不支持Jmap,需要替换成jdk11。于是在mac上安装了jdk11。安装的时候让jdk8和jdk11共存,原因是,单位项目使用的是jdk8,因此不能删。
二、Jmap在JDK11的问题
如何配置jdk8和jdk11共存切换,参考这篇文章:
cnblogs.com/ITPower/p/15527478.html
1. 检查当前jdk版本
我已经替换成了jdk11版本,需要注意的是,需要看一下我们启动的项目的jdk版本是不是11。
2. 检查idea项目中JDK版本
这里需要注意的是,修改当前项目的jdk版本即可。不要修改系统的。修改当前项目,右击项目名称-->Open Module Settings-->SDKs。
3.执行Jmap命令
Error: -heap option used Cannot connect to core dump or remote debug server. Use jhsdb jmap instead
看错误提示说让替换Jamp为jhsdb jmap,百度其用法
jhsdb jmap --heap --pid 进程号
详细jhsdb相关信息查看文档:https://www.jianshu.com/p/92931e6466b3
可是依然报错
Attaching to process ID 1525, please wait... ERROR: attach: task_for_pid(1525) failed: '(os/kern) failure' (5) Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges. sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges. at jdk.hotspot.agent/sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.execute(BsdDebuggerLocal.java:169) at jdk.hotspot.agent/sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach(BsdDebuggerLocal.java:283) at jdk.hotspot.agent/sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:672) at jdk.hotspot.agent/sun.jvm.hotspot.HotSpotAgent.setupDebuggerDarwin(HotSpotAgent.java:660) at jdk.hotspot.agent/sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:342) at jdk.hotspot.agent/sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305) at jdk.hotspot.agent/sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:141) at jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.start(Tool.java:185) at jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.execute(Tool.java:118) at jdk.hotspot.agent/sun.jvm.hotspot.tools.JMap.main(JMap.java:176) at jdk.hotspot.agent/sun.jvm.hotspot.SALauncher.runJMAP(SALauncher.java:326) at jdk.hotspot.agent/sun.jvm.hotspot.SALauncher.main(SALauncher.java:455) Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process. Could be caused by an incorrect pid or lack of privileges. at jdk.hotspot.agent/sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal.attach0(Native Method) at jdk.hotspot.agent/sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$1AttachTask.doit(BsdDebuggerLocal.java:274) at jdk.hotspot.agent/sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal$BsdDebuggerLocalWorkerThread.run(BsdDebuggerLocal.java:144)
很闹心。又折腾了半天,最后又说是权限问题的,有说是项目使用jdk和jmap运行jdk版本不一致的。我两个都试了。
权限问题解决办法,执行如下命令:
jhsdb jmap --heap --pid 2139
jdk版本问题,我们上面都设置了使用jdk11, idea也是jdk11. 但是没有编译,这里重新编译一下,再试。
最终运行项目,查看到结果
Attaching to process ID 2139, please wait... Debugger attached successfully. Server compiler detected. JVM version is 11.0.2+9 using thread-local object allocation. Garbage-First (G1) GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 4294967296 (4096.0MB) NewSize = 1363144 (1.2999954223632812MB) MaxNewSize = 2576351232 (2457.0MB) OldSize = 5452592 (5.1999969482421875MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 1048576 (1.0MB) Heap Usage: G1 Heap: regions = 4096 capacity = 4294967296 (4096.0MB) used = 21654560 (20.651397705078125MB) free = 4273312736 (4075.348602294922MB) 0.5041845142841339% used G1 Young Generation: Eden Space: regions = 15 capacity = 52428800 (50.0MB) used = 15728640 (15.0MB) free = 36700160 (35.0MB) 30.0% used Survivor Space: regions = 5 capacity = 5242880 (5.0MB) used = 5242880 (5.0MB) free = 0 (0.0MB) 100.0% used G1 Old Generation: regions = 1 capacity = 210763776 (201.0MB) used = 0 (0.0MB) free = 210763776 (201.0MB) 0.0% used
成功!