性能文章>Java“魔法”-jstack命令解析>

Java“魔法”-jstack命令解析原创

1年前
590012

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

分类:标签:
请先登录,查看1条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

字符串字面量长度是有限制的
前言 偶然在一次单元测试中写了一个非常长的字符串字面量。 正文 在一次单元测试中,我写了一个很长的字符串字面量,大概10万个字符左右,编译时,编译器给出了异常告警 `java: constant
多次字符串相加一定要用StringBuilder而不用-吗?
今天在写一个读取Java class File并进行分析的Demo时,偶然发现了下面这个场景(基于oracle jdk 1.8.0_144): ``` package test; public c
如何通过反射获得方法的真实参数名(以及扩展研究)
前段时间,在做一个小的工程时,遇到了需要通过反射获得方法真实参数名的场景,在这里我遇到了一些小小的问题,后来在部门老大的指导下,我解决了这个问题。通过解决这个问题,附带着我了解到了很多新的知识,我觉得
高吞吐、低延迟 Java 应用的 GC 优化实践
本篇原文作者是 LinkedIn 的 Swapnil Ghike,这篇文章讲述了 LinkedIn 的 Feed 产品的 GC 优化过程,虽然文章写作于 April 8, 2014,但其中的很多内容和
「每日五分钟,玩转 JVM」:久识你名,初居我心
聊聊 JVMJVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别。JVM可以说和我们是老朋友了
据说99.99%的人都会答错的类加载的问题
概述首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题。 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗请仔细注意
Java多线程——并发测试
编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。那么如何在测试中,尽可能的暴露出这些问
Java多线程知识小抄集(一)
本文主要整理笔者遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。 1.interr