常用命令:jps、jinfo、jstat、jstack、jmap
jps
jps查看java进程及相关信息
jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数
jps命令示例
显示本机的Java虚拟机进程:
# jps
15729 jar
92153 Jps
90267 Jstat
显示主类的完整包名或JAR文件名:
# jps -l
15729 one-more-1.0.0.RELEASE.jar
112054 sun.tools.jps.Jps
90267 sun.tools.jstat.Jstat
显示主类的完整包名或JAR文件名,并且显示JVM参数:
# jps -lv
15729 one-more-1.0.0.RELEASE.jar -Xmx1g -Xms1g -Xmn512m -XX:SurvivorRatio=4 -XX:MetaspaceSize=256m -XX:+UseG1GC
9043 sun.tools.jps.Jps -Denv.class.path=.:/usr/local/java/jdk1.8.0_251/lib:/usr/local/java/jdk1.8.0_251/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_251 -Xms8m
90267 sun.tools.jstat.Jstat -Denv.class.path=.:/usr/local/java/jdk1.8.0_251/lib:/usr/local/java/jdk1.8.0_251/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_251 -Xms8m
显示主类的完整包名或JAR文件名,并且显示传递给main()方法的参数:
# jps -lm
15729 one-more-1.0.0.RELEASE.jar
59014 sun.tools.jps.Jps -lm
90267 sun.tools.jstat.Jstat -gc 15729 1000
jinfo
jinfo查看JVM参数
jinfo -flags pid : 打印当前指定java进程中已经设定的所有JVM参数信息
jinfo -flags 7663
输入结果
Attaching to process ID 7663, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=49834:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8
jinfo -flag pid : 打印指定名称的参数
其中, 不包含上图的前缀 -XX: 等,不是 jinfo -flag -XX:NewSize 7663,而是 jinfo -flag NewSize 7663,不包含 -XX:
jinfo -flag NewSize 7663
输出结果:
-XX:NewSize=89128960
jinfo -flag [+|-] pid : 打开或关闭参数
jinfo -flag +PrintGC 7663
执行上面命令后,执行如下命令查看结果:
jinfo -flags 7663
jstat
jstat查看JVM运行时的状态信息,包括内存状态、垃圾回收
jstat -gc pid 5000 20 : 垃圾回收堆行为统计
5秒钟打印一次,一共打印20次。
jstat -gc pid 5000 20
输出结果:
root@yzh-zabbix-server:bin #jstat -gc 3111 5000 20
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
14336.0 24576.0 0.0 0.0 50688.0 50687.9 330752.0 330634.8 55296.0 53462.8 6400.0 5925.3 178 2.226 2483 438.892 441.117
14336.0 24576.0 0.0 0.0 50688.0 50688.0 330752.0 330607.2 55296.0 53467.9 6400.0 5925.3 178 2.226 2511 443.944 446.169
14336.0 24576.0 0.0 0.0 50688.0 50686.3 330752.0 330591.4 55296.0 53467.9 6400.0 5925.3 178 2.226 2541 449.050 451.275
14336.0 24576.0 0.0 0.0 50688.0 50687.9 330752.0 330603.5 55296.0 53467.9 6400.0 5925.3 178 2.226 2569 454.029 456.255
14336.0 24576.0 0.0 0.0 50688.0 50688.0 330752.0 330607.6 55296.0 53467.9 6400.0 5925.3 178 2.226 2598 458.971 461.197
jstack
jstack主要用来查看某个Java进程内的线程堆栈信息。主要用于,分析死锁,分析CPU 过高
语法格式如下。
jstack pid
jstack排查Java死锁步骤
- 在终端中输入jsp查看当前运行的java程序
- 使用 jstack -l pid 查看线程堆栈信息
- 分析堆栈信息
在终端中输入jps查看当前运行的java程序
使用 jstack -l pid 查看线程堆栈信息
jstack 分析CPU过高问题
- top
- top -Hp pid
- jstack pid
- jstack -l [PID] >/tmp/log.txt
- 分析堆栈信息
在服务器上,我们可以通过top命令查看各个进程的cpu使用情况,它默认是按cpu使用率由高到低排序的
由上图中,我们可以找出pid为21340的java进程,它占用了最高的cpu资源,凶手就是它,哈哈!
top -Hp pid
通过top -Hp 21340可以查看该进程下,各个线程的cpu使用情况,如下
可以发现pid为21350的线程,CPU资源占用最高,嘻嘻,小本本把它记下来,接下来拿jstack给它拍片子~
jstack pid
通过top命令定位到cpu占用率较高的线程之后,接着使用jstack pid命令来查看当前java进程的堆栈状态,jstack 21350后,内容如下:
jstack -l [PID] >/tmp/log.txt
其实,前3个步骤,堆栈信息已经出来啦。但是一般在生成环境,我们可以把这些堆栈信息打到一个文件里,再回头仔细分析哦~
分析堆栈信息
我们把占用cpu资源较高的线程pid(本例子是21350),将该pid转成16进制的值