Java问题排查常见指令:jps、jstack
JVM内存分析工具 jps、jstack、jstat、jmap、jhat 的使用 - 谢端阳 - 博客园
(99+ 封私信 / 81 条消息) JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 - 知乎
1、简介
在JAVA应用的开发和运维过程中,时常需要监控JVM的运行状态,常用的监控工具有:jps、jstat、jmap、jstack、jinfo。
2、jps
说明
jps由jdk1.5以上提供,用于查看当前用户下的java进程的pid及基本信息。
用法
jps 参数 hostid
如果hostid不指定,默认为当前服务器
参数
-q:极简输出,只输出pid
-m:输出传入main方法的参数
-l:输出完整的main类或jar名(如果是本地jar包,就从根目录开始,例如/data/apps/test.jar;如果是子类,就从最开始的父类开始,例如sun.tools.jps.jps)
-v:输出传入JVM的参数
例子
-m:输入main方法、指令的参数
-l:输出全名
root@ubuntu:/# jps -m -l 2458 org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml 29920 com.sun.tools.hat.Main -port 9998 /tmp/dump.dat 3149 org.apache.catalina.startup.Bootstrap start
3、jstack
学习自:Java程序员必备:jstack命令解析jstack是JVM自带的Java堆栈跟踪工具,它用于打印出给定的java进程I - 掘金
1)说明
jstack用于查看某个Java进程内的线程堆栈信息。
根据堆栈信息可以定位到具体代码,因此它在JVM性能调优中用的非常多。
2)用法
jstack 参数 pid
3)参数
-l:打印出额外的锁的信息,在死锁发生时可以用jstack -l pid来观察锁的持有情况
-m:不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(本地方法)
4)线程状态
由于jstack跟线程状态息息相关,所以需要先对线程状态有所了解。

Java的6种线程池状态:
New:创建后尚未启动的线程,不会出现在dump中;
RUNNABLE:包含RUNNING、READY。线程调用start()方法付时会进入该状态,代表一种在JVM中执行的状态。
WAITING:无限等待另一个线程的特定操作
TIMED_WAITING:有限等待另一个线程的特定操作
BLOCKED:阻塞,在线程进入同步区域时,线程将处于这种状态,在等待monitor锁
TERMINATED:终止,线程结束执行。
Dump文件的线程状态(只有3种):
RUNNABLE:执行中
BLOCKED:阻塞
WAITING:线程正在等待
例子
从某个Java进程中找到最耗费CPU的Java线程并定位堆栈信息:
①找出Java进程的PID:jps
jps -l
21340 /data/apps/service.jar
②找出该进程中最耗CPU的线程:top
top -Hp 21340

默认排序是按照%CPU这一列由高到低排的,从上文中可以直观看出pid为21350的Java线程占用了最高的CPU资源:
printf "%x\n" 21350
得到21742的十六进制值为5366。
③输出进程堆栈信息:jstack
输出进程堆栈信息,并根据之前查到的线程21742的十六进制值5366进行专门抓取:
jstack 21340 | grep 5366

④输出堆栈信息到文件
这一项非必须,只是问题恢复后的分析可能需要场景还原,因此记录当时的堆栈状态通常很有必要。
jstack -l pid > /tmp/log.txt
之后就可以根据括号中的内容排查CPU占用最高的是哪个Java类的哪个方法了,比如上文就是JstackCPUCase.java的24行的JstackCPUCase$Task.run()方法。
有时也可以隔段时间再执行一次jstack命令,将两次的dump结果进行对比。
如果出现锁等待情况,会在输出结果中显示为parking to wait for <0x000000000d6eb8300>这样的内容。

浙公网安备 33010602011771号