Java问题排查常见指令:jps、jstack

学习自:

jstat命令总结[通俗易懂]-腾讯云开发者社区-腾讯云

 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>这样的内容。

posted @ 2025-07-17 15:40  ShineLe  阅读(54)  评论(0)    收藏  举报