jmap
jmap是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具
1.查看整个JVM内存状态
jmap -heap [pid]
2.查看JVM堆中对象详细占用情况
jmap -histo [pid]
3.导出整个JVM 中内存信息,可以利用其它工具打开dump文件分析,例如jdk自带的visualvm工具
jmap -dump:file=文件名.dump [pid]
Jmap导出java运行中的堆内存dump及Jprofiler分析方法
1.jmap导出dump
执行jmap -dump:format=b,file=文件名 [pid]
2.Jprofiler分析方法
下载Jprofile,将jmap导出的文件web.dump文件更改后缀为web.jps,*.jps为Jprofiler可识别后缀。
使用jprofiler打开web.jps文件
这里可以看到内存使用情况,查看具体占用内存的是什么,然后选中该项右键
然后选择references,在里面选择cumulated incoming references查看具体
可以看到具体内存占用的什么
jstack
在日常工作中,我们有时候需要排查线上问题,找出系统中CPU利用率最高的线程.当然,我们这里默认被排查的线程在JVM中,而不是其他非JVM的线程.
涉及的命令
$ top
$ ps
$ jstack
思路
1.根据top和ps命令查找到进程中CPU利用率最高的线程(内核级线程)
2.将内核级线程的十进制转成十六进制
3.根据jstack命令获取JVM级的线程信息
方式一
1.通过top命令找到CPU消耗(%CPU列)最高的进程, 并记住PID
2.通过top -Hp PID 找到CPU消耗(%CPU列)最高的线程, 并记住线程TID
通过printf "%xn" 十进制线程TID # 将十进制转成十六进制
3.通过jstack PID | grep 十六进制TID -A 30
方式二
1.通过top命令找到CPU消耗(%CPU列)最高的进程, 并记住PID
2.通过ps -mp PID -o THREAD,tid,time 找到CPU消耗(%CPU列)最高的线程, 并记住线程TID
通过printf "%xn" 十进制线程TID # 将十进制转成十六进制
3.通过jstack PID | grep 十六进制TID -A 30
参考:https://blog.csdn.net/weixin_42523104/article/details/113534423
https://www.jb51.net/article/201435.htm