概述

jstack命令用于打印指定Java进程、核心文件或远程调试服务器的Java线程堆栈的跟踪信息。换句话说,就是jstack能生成JVM当前时刻的线程快照,以此来定位线程出现长时间停顿的原因,最常见应用场景为:

  • 查看线程间死锁
  • 分析CPU过高原因

针对这两个场景,后续会有实战案例~

常用指令

jstack [-option] <pid> // 打印某个进程的堆栈信息

其他常用指令如下:

指令 说明
-F 当jstack指令无响应时,强制打印一个堆栈信息
-m 打印包含Java和C/C++帧的混合模式堆栈跟踪
-l 打印关于锁的其他信息,比如拥有java.util.concurrent ownable同步器的列表
-h / -help 打印帮助信息

Jstack实战

案例一:jstack分析死锁

public class DeadLock {private static Object lockA = new Object();private static Object lockB = new Object();public static void main(String[] args) {new Thread(() ->{synchronized (lockA) {try {System.out.println("线程1开始运行========");Thread.sleep(2000);} catch (InterruptedException e) {}synchronized (lockB) {System.out.println("线程1运行结束========");}}}).start();new Thread(() ->{synchronized (lockB) {try {System.out.println("线程2开始运行========");Thread.sleep(2000);} catch (InterruptedException e) {}synchronized (lockA) {System.out.println("线程2结束运行========");}}}).start();System.out.println("主线程运行结束========");}
}

运行结果如下:

线程1开始运行========
主线程运行结束========
线程2开始运行========

可见,线程1和线程2都没有运行完成,两个线程在抢夺资源过程中陷入了死循环

排查思路

  1. 使用jps指令查看当前运行中的java程序
  2. 使用jstack -l < pid > ,输出线程及锁详情
  3. 进行死锁分析

动手实践

那么首先使用jps:

使用jstack指令:


通过上图,可以得到死锁的信息:

"Thread-1":waiting to lock monitor 0x000000001d290de8 (object 0x000000076b19b890, a java.lang.Object),which is held by "Thread-0"
"Thread-0":waiting to lock monitor 0x000000001d293678 (object 0x000000076b19b8a0, a java.lang.Object),which is held by "Thread-1"

并且可以定位到对应代码位置,是不是非常的方便~

案例二:jstack分析CPU过高

实例代码如下:

public class CpuProblem {private static ExecutorService executorService = Executors.newFixedThreadPool(5);public static void main(String[] args) {Task task1 = new Task();Task task2 = new Task();executorService.execute(task1);executorService.execute(task2);}public static Object lock = new Object();static class Task implements Runnable {public void run() {synchronized (lock) {long sum = 0L;while (true) {sum += 1;}}}}
}

排查思路

1. top
2. top -Hp <pid>
3. 获取cpu最高的进程号并转换为16进制<pid_16>
4. jstack <pid>|grep -A 10 <pid_16>
5. 查看对应问题的代码

动手实践

  1. 使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如19663

  2. 按H(获取top -Hp pid指令),获取每个线程的内存情况

  3. 找到内存和cpu占用最高的线程tid,比如19664

  4. 转为十六进制得到 0x4cd0,此为线程id的十六进制表示

  5. 执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调 用方法

  6. 查看对应的堆栈信息找出可能存在问题的代码

《JVM调优》- Jstack指令详解相关推荐

  1. 【JVM】JVM调优常见参数详解

    原文出处: https://blog.csdn.net/jyxmust/article/details/73730766 -Xms2g:JVM启动初始化堆大小为2g,Xms的默认是物理内存的1/64但 ...

  2. mysql性能调优之 max_allowed_packet 详解 解决ERROR 2006 (HY000): MySQL server has gone away

    mysql性能调优之 max_allowed_packet 详解 一.背景 mysql报错如下: SQLSTATE[HY000]: General error: 2006 MySQL server h ...

  3. JVM性能调优监控工具使用详解

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 来源:http://uee.me/czpHk 现实企业级J ...

  4. Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解

    前言 在JVM性能调优时有三个组件: 堆大小调整(内存最够大的话,尽量搞大点) 垃圾收集器调整 JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层) 大多数调优选项都与调整堆大小和为您的情况选 ...

  5. Tomcat8调优核心实战详解

    前言 本文的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合 ...

  6. mysql工具使用意义_MySQL性能分析、及调优工具使用详解

    本文汇总了MySQL DBA日常工作中用到的些工具,方便初学者,也便于自己查阅. 先介绍下基础设施(CPU.IO.网络等)检查的工具: vmstat.sar(sysstat工具包).mpstat.op ...

  7. MySQL性能调优my.cnf详解

    MySQL 5.6版本适合在1GB内存VPS上的my.cnf配置文件 [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 330 ...

  8. Spark调优工具--Sparklens详解

    前言 Sparklens如何使用 Sparklens生成的报告 参考 前言 Sparklens是一个可以帮助你了解你的Spark job效率的开源工具.Spark是个近些年来非常受欢迎的基于内存并行计 ...

  9. 系统调优--mpstat命令详解

    文章目录 一.mpstat 1.1mpstat概述 1.2命令安装 1.3mpstat参数介绍 1.4平均负载查看 二.压力测试--stress 2.1stress 2.2命令包安装 2.3stres ...

最新文章

  1. 图解5G NR帧结构
  2. numpy使用[]语法索引二维numpy数组中指定指定行之前所有数据行的数值内容(accessing rows in numpy array before specifc row)
  3. net-tools 要被 iproute2 取代了
  4. 解决JS在url中传递参数时参数包含中文乱码的问题
  5. 网络营销专员浅析在网络营销推广中有不少渠道可适当“利用”一下
  6. 【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
  7. volatile 和 synchronized的区别
  8. python3 console input_Python3 tkinter基础 Button command 单击按钮 在console中打印文本
  9. linux 查询系统性能,Linux 系统各种性能查询
  10. 01-SpringMVC 原理
  11. RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象
  12. PHP使用MySQL数据库
  13. CTFmisc常见音频隐写总结
  14. 工具类ConfigTool封装Nacos Config 本地缓存(实战附代码实现)
  15. ST语言入门(维修电工1)
  16. 反病毒工具-OllyDBG 和 UPX
  17. 西瓜视频稳定性治理体系建设三:Sliver 原理及实践
  18. 设计模式---004策略模式---【巷子】
  19. iOS证书(p12)获取解密公私钥
  20. ssm+Vue计算机毕业设计学科竞赛赛场安排系统(程序+LW文档)

热门文章

  1. 【亲测有效】一键解决PotPlayer 启动超级缓慢,无法正常播放视频
  2. 【BUG解决】Android模拟器启动 内存错误 !(内存不能为read错误)
  3. [附源码]java+ssm计算机毕业设计基于Java通识课程管理系统v87xr(源码+程序+数据库+部署)
  4. 004 还黑客一个清白!!
  5. Linux 下socket编程 connect()函数返回-1(error:Connection refused)
  6. linux软RAId配置与管理总结,Linux下使用mdadm创建和管理软raid(转)
  7. 为什么35岁以后的中年人,会对自己的未来无比焦虑?
  8. 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断
  9. PHP多线程异步请求HTTP
  10. Linux服务器ldap启动,linux搭建ldap服务器详细步骤