关于jmap的简单使用和踩坑记录



参数:

option: 选项参数。
pid: 需要打印配置信息的进程ID。
executable: 产生核心dump的Java可执行文件。
core: 需要打印配置信息的核心文件。
server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
remote server IP or hostname 远程调试服务器的IP地址或主机名。

option

no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump::生成堆转储快照
F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
help:打印帮助信息
J:指定传递给运行jmap的JVM的参数

链接:https://www.jianshu.com/p/a4ad53179df3,包括更加详细的实例操作。

报错记录

jmap -histo 是没有什么问题的,但是jmap总是出现问题

Attaching to process ID 614, please wait...
attach: task_for_pid(614) failed (5)
Error attaching to process: Error attaching to process, or no such process

在这里插入图片描述
前面加上sudo

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the
 process. Could be caused by an incorrect pid or lack of privileges.

在这里插入图片描述
mac上好像无解了,linux上https://blog.csdn.net/wxa136/article/details/22647733

Caused by: java.lang.RuntimeException: Type "Klass*", referenced in 
VMStructs::localHotSpotVMStructs in the remote VM, was not present in the remote 
VMStructs::localHotSpotVMTypes table (should have been caught in the debug build 
of that VM). Can not continue.

修改jdk为1.8

通过java api进行监控哪些类消耗jvm内存

Windows系统:

String[] cmds = new String[]{
            "cmd",
            "/c",
            "jmap -histo:live [pid] | findstr \"com.sun org.sun\" | findstr -v \"com.cloudwise.agent com.java\""
};
Process p = Runtime.getRuntime().exec(cmds);

Linux系统:

String[] cmds = new String[]{
            "/bin/sh",
            "-c",
            "jmap -histo:live [pid] | grep \"com.sun\\|org.sun\" | grep -v \"com.cloudwise.agent\\|com.java\""
};
Process p = Runtime.getRuntime().exec(cmds);

上面的意思是grep 包括哪些 grep -v 排除哪些


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM