2

Java“魔法”-jstack命令解析

 3 years ago
source link: https://club.perfma.com/article/2365663
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java“魔法”-jstack命令解析

阿飞云
jstack
13小时前

image.png
image.png

在介绍jstack之前,先简单介绍一下jps。因为jps使用相对简单,各位看官看一下便知。
jps的作用是显示当前系统的java进程情况,及其id号。jps是【进程查询】魔法。
Java进程Id的查询也可以使用如:
ps -ef | grep java

需说明一下:jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。
常用命令:

jps -ml
# 查看Java进程对应的给JVM的参数
jps -v
# 根据 name 查找 java 进程
jps -mlvV | grep <name>
# 根据 name 查找 pid
jps | grep <name>

举个示例:

jps -lm

image.png

jps -lv

image.png
lv:要记住哈~ 到这里jps也就告一段落了,下面正式开始jstack的内容。

jstack介绍

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。

官网文档地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html

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 输出线程的信息。

# 输出结果  
jstack -l pid    
#输出结果到日志中
jstack -l pid > /tmp/jstack.log 

大致信息如下:

 
"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的排查和解决过程

0人觉得很赞
758 阅读

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK