JVM(11):虚拟机性能分析和故障解决工具之jstack工具

1 jstack(Stack Trace forJava)作用

查看或导出 Java 应用程序中线程堆栈信息 。

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、长时间等待外部资源等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息.

2 命令格式

jstack [ options ]

参数解释:

第一个参数:options

  • -F : 当线程挂起时,使用jstack -l pid 请求不被响应时,强制输出线程堆栈
  • -l : 除堆栈外,显示关于锁的附加信息,例如 ownable synchronizers
  • -m : 可以同时输出java以及C/C++的堆栈信息

3 命令演示

3.1 基本命令演示

package com.example.demo;import java.io.IOException;
/*jstack:-F : 当线程挂起时,使用jstack pid 请求不被响应时,强制输出线程堆栈-l : 除堆栈外,显示关于锁的附加信息,例如 ownable synchronizers-m : 可以同时输出java以及C/C++的堆栈信息*/public class jsctackdemo {public static void main(String[] args) throws IOException {System.out.println("jstack");System.in.read();}
}

jstack -m  5756

jstack -l  5756

jstack -F  5756

4 案例演示

4.1 ​ CPU占用过高

(1)演示代码

package com.example.demo;import java.io.IOException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class jsctackdemo {public static void main(String[] args) throws IOException {System.out.println("start");test1();System.out.println("end");}//死循环public static void test1() {while (true) {}}}

(2)使用Process Explorer工具,找到CPU占用率高的进程的id;

(3)右击该进程,查看属性,在thread选项卡中,找到cpu占用率高的线程id

​(4)把线程id转换成16进制

其中3df0就是你的线程号

(5)使用jstack -l 查看进程的线程快照

(6)在线程快照中找到指定的线程,并分析代码

上面显示了导致CPU飚高的文件位置。

4.2 等待控制台输出

(1)代码如下

package com.example.demo;import java.io.IOException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class jsctackdemo {public static void main(String[] args) throws IOException {System.out.println("start");test2();System.out.println("end");}//等待控制台输入public static void test2() {try {System.in.read();} catch (IOException e) {e.printStackTrace();}}}

(2)使用Process Explorer工具,查看等待进程;

(3)使用jstack -l 查看进程的线程快照

4.3 死锁

(1)代码如下

package com.example.demo;import java.io.IOException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class jsctackdemo {public static void main(String[] args) throws IOException {System.out.println("start");test3();System.out.println("end");}//死锁public static void test3() {Lock lock1 = new ReentrantLock();Lock lock2 = new ReentrantLock();new Thread(() -> {try {lock1.lock();Thread.sleep(100);lock2.lock();//需要加锁,加锁失败,锁被另外一个线程mythread2持有了} catch (InterruptedException e) {e.printStackTrace();}}, "myThread1").start();new Thread(() -> {try {lock2.lock();Thread.sleep(100);lock1.lock();//通过lock1加锁,失败,等待锁被释放} catch (InterruptedException e) {e.printStackTrace();}}, "myThread2").start();}
}

(2)使用jstack -l 查看进程的线程快照

发现两个锁在相互等待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例:MySQL主从复制与读写分离

一、案例分析 1.案例概述 在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说都是通过主从复制(Master-Slave)来同步数据,再通…

uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因:vite 中不支持,换成 ::v-deep 或:deep即可

python setup函数中,name参数的作用

setup函数是setuptools库中的一个函数,用于配置和分发Python软件包。 setup函数的name参数指定了该软件包的名称,这个名称在包发布到PyPI(Python Package Index)时会作为该包的标识符。其他开发者可以通过这个名称来安装和使用你…

C语言 求最大公约数和最小公倍数

这个程序定义了两个函数&#xff0c;一个用于计算两个正整数的最大公约数 (GCD)&#xff0c;另一个用于计算最小公倍数 (LCM)。在主函数中读取用户输入的两个正整数&#xff0c;并调用这两个函数输出结果。 #include <stdio.h>// 计算最大公约数的函数&#xff0c;使用辗…

[大师C语言(第四十篇)]C语言volatile关键字深度解析与实战技巧

第一部分&#xff1a;C语言volatile关键字深度解析 一、volatile关键字的作用 在C语言中&#xff0c;volatile关键字是一个用于声明变量的修饰符。它用于指定一个变量的值在程序执行过程中可能会被外部设备或中断服务程序修改&#xff0c;因此编译器不应该对这样的变量进行优…

浅谈人工智能发展趋势

第三次浪潮 人类科技发展的主线正沿着“能源”和“新型”展开。AI的尽头是光伏和储能。 如今我们正在经历第三次浪潮——信息文明。 社会生产力 劳动对象 劳动工具 劳动者 生产要素 农业文明铜器铁器 材料 人力工具 农民 土地人力 工业文明机车电力 材料动力 动力…

判断一个函数是否有装饰器

判断一个函数是否有装饰器 如何判断一个函数是否有装饰标记&#xff0c;如果有我们在pytest收集用例的时候能做一些什么操作呢 def my_decorator(func):def wrapper(*args, **kwargs):print("Function is being decorated!")return func(*args, **kwargs)return wr…

Java web应用性能分析之【prometheus监控K8s指标说明】

常规k8s的监控指标 单独 1、集群维度 集群状态集群节点数节点状态&#xff08;正常、不可达、未知&#xff09;节点的资源使用率&#xff08;CPU、内存、IO等&#xff09; 2、应用维度 应用响应时间 应用的错误率 应用的请求量 3、系统和集群组件维度 API服务器状态控…

springboot try...catch 影响事务回滚

示例 事务不会回滚 OverrideTransactional(rollbackFor Exception.class)public CommonResponse modifyTeaFormula(GemiTeaFormulaReq gemiTeaFormulaReq) {try {省略部分代码teaFormulaDao.deleteById(id);teaFormulaDetailDao.deleteById(id);} catch (Exception e) {logger…

Calendar类在Java中的高级应用与使用技巧

Calendar类在Java中的高级应用与使用技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; **1. **引言 在Java中&#xff0c;处理日期和时间是开发中经常遇到…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册&#xff1a;https://cn.vuejs.org/guide/quick-start.html 一、找个盘符&#xff0c;新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目&#xff0c;所以有文件&#xff0c;你们初次是没有…

IT专业入门,高考假期预习指南

文章目录 一、了解IT专业的基本概念二、选择适合的编程语言入门三、掌握基本的编程工具和环境四、学习基础的数据结构和算法五、实践项目和动手实验六、利用在线资源进行学习七、参加编程竞赛和社区活动总结 高考结束后&#xff0c;许多同学将迎来大学生活&#xff0c;而对于选…

C++将模板类用作参数

#include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。template <class T, int len> class LinkList // 链表类模板。 { public:T* m_head; // 链表头结点。int m_len len; // 表长。void…

mysql的前缀索引

什么是前缀索引 所谓的前缀索引&#xff0c;说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定)&#xff0c;比如以产品名称的前10位来建索引&#xff0c;这样建立起来的索引更小&#xff0c;查询效率更快有点类似oracle中对字段使用left函数来建立函数索…

Java与机器学习模型的集成与部署

Java与机器学习模型的集成与部署 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨如何使用Java集成和部署机器学习模型。 随着人工智能和机器学习…

【SQL】使用索引的好处

使用索引可以显著加快查询速度&#xff0c;主要原因有以下几个方面&#xff1a; 1. 减少数据扫描量 索引类似于一本书的目录&#xff0c;可以让数据库快速找到特定的数据行&#xff0c;而不是从头到尾扫描整个表。例如&#xff0c;没有索引的情况下&#xff0c;查询 SELECT *…

简洁版人工智能训练流程

人工智能&#xff08;AI&#xff09;训练流程是指使用数据来训练机器学习模型&#xff0c;使其能够执行特定任务的过程。以下是人工智能训练的一般流程&#xff1a; #mermaid-svg-qZ5c5PU9yms7cVOB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:…

Java中如何优雅地处理NamingException异常?

Java中如何优雅地处理NamingException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java开发中&#xff0c;NamingException异常是JNDI&…

鸿蒙arkts api9 图片验证码 canvas

/*** 图片验证码***/ Component export default struct RandomTxtCanvas {Link imgRandomTxt:string//图片验证private settings: RenderingContextSettings new RenderingContextSettings(true)private context: CanvasRenderingContext2D new CanvasRenderingContext2D(th…

DataWhaleAI Tsak1 运行Baseline

题目背景 在当今数字化时代&#xff0c;企业积累了丰富的对话数据&#xff0c;这些数据不仅是客户与企业之间交流的记录&#xff0c;更是隐藏着宝贵信息的宝库。在这个背景下&#xff0c;群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。 群聊对话分角色要素提取…