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即可

浅谈人工智能发展趋势

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

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

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

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

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

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

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

DataWhaleAI Tsak1 运行Baseline

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

nlp--最大匹配分词(计算召回率)

最大匹配算法是一种常见的中文分词算法,其核心思想是从左向右取词,以词典中最长的词为优先匹配。这里我将为你展示一个简单的最大匹配分词算法的实现,并结合输入任意句子、显示分词结果以及计算分词召回率。 代码 : # happy coding…

Tektronix泰克 AWG70001A 任意波形发生器

Tektronix泰克 AWG70001A 任意波形发生器 AWG70000A 系列任意波形发生器 (AWG) 在采样率、信号保真度和波形内存方面代表着尖端水平,特别适合复杂器件、系统和实验的设计、测试和操作。由于高达 50 GS/s 采样率和 10 位垂直分辨率,它提供了优秀的信号激…

【Python】入门Python,你必须了解这些事

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言一、认识Python什么是Python?!Python的起源Python的特点简洁易读跨平台,可移植拥有强大的库和框架面向对象 Python的优缺点优点缺点 Python的应用环境扩…

linux ls文件排序

linux可以使用ls命令结合一些选项来按照文件大小对文件和目录进行排序。以下是一些常用的方法: 1、这里,-l 选项表示长格式输出(包括文件权限、所有者、大小等),-S 选项表示按照文件大小排序,-h 选项表示以…

PHP留守儿童关爱之家网站-计算机毕业设计源码11079

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3 论文结构与章节安排 2 留守儿童关爱之家网站系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程和逻辑 2.5本章小结 3 留守儿童关爱之家网站总体设计 3.1系统结构设计 3.2系统功能模块设计 3.2 数…

【算法训练记录——Day38】

Day38——动态规划Ⅰ 1.理论#2.leetcode_509斐波那契数3.leetcode_70爬楼梯4.kamacoder_57爬楼梯5.leetcode_746使用最小花费爬楼梯 1.理论 一般解题步骤: 确定dp数组及下标含义确定递推公式数组如何初始化确定递归顺序举例推导dp数组 #2.leetcode_509斐波那契数…

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面,它提供了用户与系统交互的接口,这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…

linux虚拟机部署的MySQL如何使用外网访问?教你轻松使用cpolar在centos搭建内网穿透

文章目录 写在前面实现Linux的内网穿透1、官网账号注册2、在Linux部署我们自己的项目3、一键自动下载安装cpolar4、设置自己的token5、启动cpolar服务6、MySQL穿透测试 卸载方法 写在前面 相信很多小伙伴在本地搭建了一个MySQL数据库,想让其他同事或者合作者一起使…

BCFtools安装

记得之前安装这个软件的时候是非常简单的,但是今天重新安装的时候出现了很多的麻烦,想想还是做个记录吧! bcftools的下载地址如下: Releases samtools/bcftools (github.com)https://github.com/samtools/bcftools/releases/这里我们选用的…

【数据结构】(C语言):队列

队列: 线性的集合。先进先出(FIFO,first in first out)。两个指针:头指针(指向第一个进入且第一个出去的元素),尾指针(指向最后一个进入且最后一个出去的元素&#xff0…

Linux CentOS 7 离线安装.NET环境

下载 下载.NET 例如: aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录: /usr/local/dotnet/aspnetcore-runtime-6.0.15-linux-x64.tar.gz 解压 cd /usr/local/dotnet/ tar -zxvf aspnetcore-runtime-6.0.15-linux-x64.tar.gz 创建…

Linux开发讲课29---Linux USB 设备驱动模型

Linux 内核源码:include\linux\usb.h Linux 内核源码:drivers\hid\usbhid\usbmouse.c 1. BUS/DEV/DRV 模型 "USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口": US…

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…