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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐