彻底解决Jmap在mac版本无法使用的问题

简介: 彻底解决Jmap在mac版本无法使用的问题

彻底解决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版本

1187916-20211109113524485-1436745477.png

我已经替换成了jdk11版本,需要注意的是,需要看一下我们启动的项目的jdk版本是不是11。


2. 检查idea项目中JDK版本

1187916-20211109113927610-644530380.png

这里需要注意的是,修改当前项目的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

成功!

相关文章
|
6月前
【Node】Mac多版本Node切换
【Node】Mac多版本Node切换
497 1
|
1月前
|
开发工具 iOS开发 MacOS
【Mac_mistake】app不能安装在未命名需要OSv11.13或更高版本
【Mac_mistake】app不能安装在未命名需要OSv11.13或更高版本
68 0
|
3月前
|
JavaScript 前端开发 Shell
mac和windows上安装nvm管理node版本
NVM(Node Version Manager)是前端开发者常用的命令行工具,用于管理计算机上的不同Node.js版本。通过NVM,开发者可以轻松地在多个项目间切换所需的Node.js版本。在Mac上,可以通过cURL或Wget下载安装脚本,或使用包管理工具brew安装。安装后需配置环境变量以识别NVM命令。Windows用户则可通过专用的nvm-windows安装程序完成安装。常用命令包括安装、卸载特定版本、列出已安装版本等。
318 0
|
6月前
使用mac版本试用版Beyond过期报错,反复提示要注册的提示信息问题,暂时没有解决方案
使用mac版本试用版Beyond过期报错,反复提示要注册的提示信息问题,暂时没有解决方案
95 1
|
6月前
|
iOS开发
mac版本Beyond Compare如何一直试用
mac版本Beyond Compare如何一直试用
324 0
mac版本Beyond Compare如何一直试用
|
6月前
|
JavaScript
Mac 使用CLI脚手架创建 Vue项目、不同版本创建项目的项目结构差异
Mac 使用CLI脚手架创建 Vue项目、不同版本创建项目的项目结构差异
|
缓存
Mac版本的EMAS补丁生成工具闪退
Mac版本的EMAS补丁生成工具闪退
70 2
|
6月前
QT 5.14.2版本 MAC环境安装部署流程
QT 5.14.2版本 MAC环境安装部署流程
547 0
|
6月前
|
缓存 JavaScript
mac升级node到指定版本
mac升级node到指定版本
|
6月前
|
JavaScript 前端开发 iOS开发
【macOS 系列】如何在mac下安装nvm实现多版本nodejs
【macOS 系列】如何在mac下安装nvm实现多版本nodejs
336 0