Java--定位问题工具

jps (JVM process status)可以查看Java虚拟机进程执行情况,-l显示具体的启动类,-m显示具体的入参。-v显示启动配置的jvm参数

jps -l

Java--定位问题工具_第1张图片

jstats(JVM statistic Monitoring tool):查看虚拟机上各项运行状态信息。
查看虚拟机号为5640的gc情况。

jstat -gc 5640

在这里插入图片描述

jinfo:查看和调整虚拟机的各项参数

jinfo -flag

如查看是否使用了UseSerial垃圾回收器

jinfo -flag UseSerialGC 5640

在这里插入图片描述
使用的减号,那么没用用UseSerial收集器。

jmap(JVM Memory Map For Java):生成堆内存快照,

jmap -dump:format=b,file=jmapDumpFile 3137

也可以在出现内存溢出后自动生成dump文件。

jhat(JVM Heap Analysis Tool)分析jmap生成的堆内存快照。

jhat jmapDumpFile

显示Server is ready后在浏览器中输入http://192.168.209.101:7000查看结果
一帮查询堆内存中总容量最大的对象。
Java--定位问题工具_第2张图片

jstack:生成线程执行的栈信息,定位线程出现长时间停顿的原因

jstack -l 3137

定位线上CPU使用率过高的问题。
模拟该场景,在main函数中写个死循环,使用top命令得到该进程id。
Java--定位问题工具_第3张图片
使用jps -l查询得到是那个项目
在这里插入图片描述
如下命令得到占用的线程

ps -mp 2050 -o THREAD,tid,time

time为占用的时间,tid为线程id
Java--定位问题工具_第4张图片
-m显示所有的线程
-p pid进程使用cpu的时间
-o 使用用户自定义的格式。
占用的线程为2051,需要转换为16进制。

printf "%x\n" 2051

如果出现16进制数为字母,需要转为小写。

如下命令得到具体那个线程

jstack 2050 |grep 803 -A60

整体流程为:
1 通 过 t o p 得 到 占 用 过 高 的 进 程 i d \color{#FF0000}{1 通过top得到占用过高的进程id} 1topid
2 通 过 p s − m p 得 到 占 用 过 高 的 线 程 i d \color{#FF0000}{2 通过ps -mp得到占用过高的线程id} 2psmp线id
3 通 过 j s t a c k 进 程 i d 得 到 线 程 快 照 , 从 快 照 中 g r e p 那 个 线 程 i d , 即 可 得 到 具 体 是 那 个 线 程 执 行 的 那 个 代 码 块 \color{#FF0000}{3 通过jstack 进程id得到线程快照,从快照中grep那个线程id,即可得到具体是那个线程执行的那个代码块} 3jstackid线grep线id线

你可能感兴趣的:(Java)