大家好,又见面了,我是全栈君。
怕什么真理无穷
进一步有近一步的欢喜
前情预告
在介绍jstack之前,先简单介绍一下jps。因为jps使用相对简单,各位看官看一下便知。
jps的作用是显示当前系统的java进程情况,及其id号。jps是【进程查询】魔法。
Java进程Id的查询也可以使用如:
ps -ef | grep java
需说明一下:jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
常用命令:
代码语言:javascript复制# 查看 java 进程,显示 pid,完整包名以及 main 函数参数
jps -ml
# 查看Java进程对应的给JVM的参数
jps -v
# 根据 name 查找 java 进程
jps -mlvV | grep <name>
# 根据 name 查找 pid
jps | grep <name>
举个示例:
代码语言:javascript复制jps -lm
代码语言:javascript复制jps -lv
lv:要记住哈~ 到这里jps也就告一段落了,下面正式开始jstack的内容。
jstack介绍
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
命令说明
官网文档地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html
代码语言:javascript复制Usage:
jstack [-l] <pid>
(to connect to running process) 连接活动线程
jstack -F [-m] [-l] <pid>
(to connect to a hung process) 连接阻塞线程
jstack [-m] [-l] <executable> <core>
(to connect to a core file) 连接dump的文件
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server) 连接远程服务器
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
在使用jstack之前需要先大概知道线程的状态相关的知识,下面为你准备好了。
线程状态
线程在运行的过程中,会在几种状态中进行切换,我们可以用jstack命令查看线程堆栈信息时,可能会看到的线程的几种状态,了解这些线程的状态,方便后续对于具体问题的排查和解决。
- NEW :未启动的。不会出现在Dump中
- RUNNABLE :在虚拟机中准备执行的
- BLOCKED :阻塞并等待监视器锁
- WATING :无限期等待另一个线程执行特定操作
- TIMED_WATING :有时限的等待另一个线程的特定操作
- TERMINATED :已退出的,线程终止
jstack输出日志
知道要查询应用的PId,就可以使用jstack 输出线程的信息。
代码语言:javascript复制# 输出结果
jstack -l pid
#输出结果到日志中
jstack -l pid > /tmp/jstack.log
大致信息如下:
代码语言:javascript复制Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.151-b12 mixed mode):
"Attach Listener" #50173 daemon prio=9 os_prio=0 tid=0x00007f4ba401a800 nid=0x69ab waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Pinpoint-Grpc-ActiveThreadCountService-Timer" #12474 daemon prio=5 os_prio=0 tid=0x00007f4b54051000 nid=0x292b in Object.wait() [0x00007f4bd067f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at java.util.TimerThread.mainLoop(Timer.java:526)
- locked <0x00000000f065d3f0> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)
Locked ownable synchronizers:
- None
使用的技巧
jstack检测死锁
Found one Java-level deadlock: …. 省略信息 Found 1 deadlock
jstack统计线程数
jstack -l pid | grep ‘java.lang.Thread.State’ | wc -l
jstack检测cpu占用高
1、查看cpu占用高进程 2、查看cpu占用高线程 2、转换线程ID 4、定位cpu占用线程 5、分析原因和解决
具体的详细步骤可以参考我之前写的这篇文章:体验了一把线上CPU100%及应用OOM的排查和解决过程
tips:最近很多伙伴后台留言说准备换新地方体验【拧螺丝】的工作了,
See you next good day~
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120959.html原文链接:https://javaforall.cn