jstack java堆栈跟踪工具

news2024/12/23 18:36:25

jstack java堆栈跟踪工具

1、jstack介绍

jstackstack trace for java)是java虚拟机自带的一种堆栈跟踪工具。

jstack主要用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法

堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源

导致的长时间等待等。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事

情,或者等待什么资源。

jstack主要分为两个功能:

  1. 针对活着的进程做本地的或远程的线程dump
  2. 针对core文件做线程dump

当指定的进程在64位Java虚拟机上运行时,可能需要指定-J-d64选项,例如:jstack -J-d64 -m pid

2、线程状态

线程通常有下面5中状态:

1、新建状态(New): 新创建了一个线程对象。

2、就绪状态(Runnable) :线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可

​ 运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running): 就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked): 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就

​ 绪状态,才有机会转到运行状态。阻塞的情况分三种:

  • 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池

    中。

  • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。

    当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

关于线程状态,具体也可以查看:java.lang.Thread.State类。

在这里插入图片描述

想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命

令查看线程堆栈信息时可能会看到的线程的几种状态:

  • RUNNABLE,线程运行中或I/O等待
  • BLOCKED,线程被阻塞,在等待monitor锁(synchronized关键字)
  • TIMED_WAITING ,线程在等待唤醒,但设置了时限
  • WAITING ,线程在无限等待唤醒

在线程的堆栈中,需要特别留意以下几种状态:

  • Deadlock: 死锁(重点关注)
  • Waiting on condition: 等待资源(重点关注)
  • Waiting on monitor entry : 等待获取监视器(重点关注)
  • Blocked :阻塞(重点关注)
  • Runnable :执行中
  • Suspended : 暂停
  • Object.wait()或TIME_WAITING :对象等待中
  • Parked : 停止

3、jstack命令格式

jstack [ option ] pid

jstack [ option ] executable core

jstack [ option ] [server-id@]remote-hostname-or-IP

pid:Java进程的ID,可以通过jps命令查询到。

executable: 产生core dump的Java可执行程序。

core:要打印的堆栈跟踪的核心文件。

server-id:当多个DEBUG服务器在同一远程主机上运行时,可使用的可选唯一ID。

remote-hostname-or-IP:远程DEBUG的服务器主机名或IP地址。

pid: 需要被打印配置信息的java进程id,可以用jps查询。

常用参数说明:

-F:当 jstack [-l] pid 没有响应时,强制打印一个堆栈转储。

-l:打印关于锁的其他信息,比如拥有的java.util.concurrent ownable同步器的列表,会使得

JVM停顿得长久得多。

-m:打印包含Java和本机C/ C++帧的混合模式堆栈跟踪。

-h:打印帮助信息。

-help:打印帮助信息。

3.1 jstack pid

在这里插入图片描述

第一行各个单词的解析,

  • daemon:线程名称 。

  • prio:线程优先级

  • tid:指Java Thread id。

  • nid:指native线程的id。。

  • [0x000000002369e000]:线程栈起始地址。

3.2 死循环

package com.example.controller;

public class Test2 {

    public static void main(String[] args) {
        while (true) {
        }
    }
    
}

在这里插入图片描述

3.3 Object.wait()情况

package com.example.controller;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test3 {
    static class TestTask implements Runnable {
        @Override
        public void run() {
            synchronized (this) {
                try {
                    //等待被唤醒
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        ExecutorService ex = Executors.newFixedThreadPool(1);
        ex.execute(new TestTask());
    }
}

在这里插入图片描述

3.4 死锁情况

package com.example.controller;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test4 {

    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        ExecutorService ex = Executors.newFixedThreadPool(2);
        // 起10个线程
        for (int i = 0; i < 10; i++) {
            int order = i % 2 == 0 ? 1 : 0;
            ex.execute(new TestTask(order, obj1, obj2));
        }
    }

    static class TestTask implements Runnable {
        private Object obj1;
        private Object obj2;
        private int order;

        public TestTask(int order, Object obj1, Object obj2) {
            this.order = order;
            this.obj1 = obj1;
            this.obj2 = obj2;
        }

        public void test1() throws InterruptedException {
            synchronized (obj1) {
                synchronized (obj2) {
                    System.out.println("test。。。");
                }
            }
        }

        public void test2() throws InterruptedException {
            synchronized (obj2) {
                synchronized (obj1) {
                    System.out.println("test。。。");
                }
            }
        }

        @Override
        public void run() {
            while (true) {
                try {
                    if (this.order == 1) {
                        this.test1();
                    } else {
                        this.test2();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在这里插入图片描述

3.5 等待io

package com.example.controller;

import java.io.IOException;
import java.io.InputStream;

public class Test5 {

    public static void main(String[] args) throws IOException {
        InputStream is = System.in;
        int i = is.read();
        System.out.println("exit。");
    }

}

在这里插入图片描述

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

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

相关文章

信息安全工程师软考知识点

文章目录 知识点总结2023软考总结选择题问答题 知识点总结 军用不对外公开的信息系统安全等级至少应该>三级 数据中心的耐火等级不应低于二级 政府网站的信息安全等级原则上不应低于二级第一代交换机以集线器为代表&#xff0c;工作在OSI物理层 第二代交换机以太网交换机&a…

关于论文图表目录和交叉引用的使用小结

目录 1 题注用法 2 交叉引用 最近在写论文&#xff0c;遇到不少Word使用的问题(错误&#xff01;文档中没有指定样式的文字。) 网上其实也有很多解决方案但我当时还是折腾了几个小时才整出来图目录&#xff0c;以下是针对我目前使用的感觉简明很多的方法。 1 题注用法 1) 假…

Selenium+JQuery定位方法及应用

SeleniumJQuery定位方法及应用 1 JQuery定位说明1.1 JQuery定位方法1.2 JQuery最常用的三个操作1.3 JQuery一个示例1.3.1 用户名输入框1.3.2 密码输入框1.3.3 登陆按钮1.3.4 完整代码 2 JQuery选择器2.1 常用选择器列表2.2 思考 1、关于Selenium提供了很多元素定位方法&#xf…

解决计算中msvcp120.dll丢失问题,总结5个有效的方法

msvcp120.dll是Microsoft Visual C 2013 Redistributable中的一个动态链接库文件&#xff0c;它提供了许多重要的函数和类&#xff0c;用于支持各种应用程序的正常运行。当这个文件丢失或损坏时&#xff0c;可能会导致一些应用程序无法启动或运行错误。 msvcp120.dll的属性 文件…

ssm826基于ssm的电影评论系统+vue

ssm826基于ssm的电影评论系统vue 交流学习 ​​​​​​​ 演示 项目功能演示&#xff1a; ————————————————

【数据分享】我国雏鹰企业数据(excel格式\shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 本次我们为大家带来的…

MSVCP140_1.dll,是什么意思?msvcp140_1.dll丢失的解决方法分享

今天我在打开电脑一款软件时候&#xff0c;突然提示‘’msvcp140_1.dll丢失‘’我不知道怎么办&#xff0c;经过我几天的努力终于找到msvcp140_1.dll文件的解决方法&#xff0c;也成功解决这个问题&#xff0c;解决了我的困扰&#xff0c;也成功找到msvcp140_1.dll为什么会丢失…

关于企业海外Social平台营销布局,你需要了解这三件事

01 企业Social营销布局模式 Social营销走到现在&#xff0c;早已进入了标准配置期。任何企业和组织&#xff0c;进行营销宣传的时候都会在社媒社交平台上创建账号和运营。目前&#xff0c;海外Social平台营销模式基本分为四类&#xff1a; 官方社媒账号运营&#xff1a;以Hoot…

自我报错-----断言

断言 最近在阅读freertos源码时&#xff0c;经常在某些某些API函数中遇到assert&#xff08;断言&#xff09;&#xff0c;其实断言就是用来判断表达式是否成立&#xff0c;而进行自我报错&#xff0c;防止程序后续发生未知的错误&#xff0c;可以这么理解 if(条件true)//程序…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

高级运维学习(十六)Prometheus 监控

Prometheus概述 Prometheus是一个开源系统监控和警报工具包&#xff0c;最初由 SoundCloud构建。也是一款监控软件&#xff0c;也是一个时序数据库。Prometheus 将其指标收集并存储为时间序列数据&#xff0c;即指标信息与记录时的时间戳以及称为标签的可选键值对一起存储。主…

web 自动化测试,这8 个核心知识点,你一定得掌握

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

设计原则 | 单一职能原则

一、单一职能原则&#xff08;SRP&#xff1a;Single Responsibility Principle&#xff09; 1、原理 就一个类而言&#xff0c;应该仅有一个引起它变化的原因。如果一个类承担的职责过多&#xff0c;就等于把这些职责耦合在一起。一个职责的变化可能会削弱或者抑制这个类完成…

DMP大湾区工博会开幕在即,狂撒100万福利,邀您与2200+展商面对面

截止11月9日&#xff0c;DMP大湾区工博会2023已迎来超100万人关注。大湾区工博会将于11月27-30日在深圳国际会展中心(宝安)举办。作为工业制造行业的风向标&#xff0c;展会将带来2200多家全球参展企业、40多场主题演讲、数千项行业新品技术。 本届DMP大湾区工博会&#xff0c;…

Rocky DEM 高尔顿板 小球掉落正态分布模拟

Rocky DEM 高尔顿板 小球掉落正态分布模拟 前言一、外部三维模型的建立二、导入到Rocky中并设置1.导入外部三维模型2.打开3D视图3.添加颗粒入口界面4.添加颗粒并设置属性5.设置颗粒与墙壁的碰撞属性6.设置颗粒入口流量7.求解 三、动画序列设置并导出 前言 刚开始学习离散元软件…

测试面试越自信越好吗?

前几天面试了一位小伙子&#xff0c;我觉得比较有代表性&#xff0c;所以拿出来跟大家分享一下。 我们公司的招聘流程是首先HR主动寻找或者挑选投简历者中比较合适的人来公司应聘&#xff0c;先是笔试&#xff0c;笔试包括英文部分和专业知识部分&#xff0c;根据做题的结果再…

计算复杂性理论(一)图灵机

计算复杂性理论&#xff08;一&#xff09;图灵机 一台 k-带图灵机&#xff08;TM&#xff09;M 有 k-条带子。第一条带子称为输入带&#xff0c;用来存放输入数据&#xff0c;输入带是只读带。其余 k−1 条带子是工作带&#xff0c;既可以从工作带上读信息&#xff0c;也可以…

【数据结构—— 栈的实现(数组栈)】

数据结构—— 栈的实现 一.栈1.1栈的概念及结构 二.栈的实现2.1头文件的实现——&#xff08;Strck.h&#xff09;2.2 源文件的实现——&#xff08;Strck.c&#xff09;2.3 源文件的实现——&#xff08;test.c&#xff09; 三.栈的实际数据测试展示3.1正常的后进先出方式3.2 …

眼科动态图像处理系统使用说明(2023-8-11 ccc)

眼科动态图像处理系统使用说明 2023-8-11 ccc 动态眼科图像捕捉存贮分析与传输系统&#xff0c;是由计算机软件工程师和医学专家组结合&#xff0c;为满足医院临床工作的需要&#xff0c;在2000年开发的专门用于各类眼科图像自动化分析、处理和传输的软件系统。该系统可以和各…

jetsonTX2 nx配置tensorRT加速yolov5推理

环境说明 Ubuntu 18conda环境python3.9cuda10.2&#xff0c;硬件平台是Jetson tx2 nx 前提你已经能运行YOLOV5代码后&#xff0c;再配置tensorRT进行加速。 目前只试了图片检测和C打开USB摄像头进行视频检测&#xff0c;希望是使用python配合D435i深度相机来实现检测&#xff…