您当前的位置: 首页 >  小志的博客 Java

深入理解Java虚拟机——Java堆栈跟踪工具(jstack)

小志的博客 发布时间:2022-02-19 21:15:23 ,浏览量:4

目录

    • 一、Java堆栈跟踪工具(jstack)的概述
    • 二、线程快照
      • 2.1、线程快照的概述
      • 2.2、线程快照的目的
    • 三、Java堆栈跟踪工具(jstack)的格式及参数说明
    • 四、Java堆栈跟踪工具(jstack)的执行样例1
    • 四、Java堆栈跟踪工具(jstack)的执行样例2

一、Java堆栈跟踪工具(jstack)的概述

  • jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。

二、线程快照

2.1、线程快照的概述

  • 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

2.2、线程快照的目的

  • 生产线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的原因。
  • 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事,或者等待着什么资源。

三、Java堆栈跟踪工具(jstack)的格式及参数说明

  • jstack格式
    jstack [option] vmid

  • 参数说明

    选项作用
    -F当正常输出的请求不被响应时,强制输出线程堆栈
    l除堆栈外,显示关于锁的附加信息
    m如果调用到本地方法的话,可以显示C/C++的堆栈

四、Java堆栈跟踪工具(jstack)的执行样例1

  • 执行查看进程号命令

    jps
    
  • 查看线程的信息

    jstack -l pid
    
  • 截图如下:

四、Java堆栈跟踪工具(jstack)的执行样例2

  • 在JDK1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成jstack的大部分功能。
    -示例代码

    import java.util.Map;
    /**
     * @description:
     * @author: xz
     */
    public class Test1 {
        public static void main(String[] args) {
            Map allStackTraces = Thread.getAllStackTraces();
            for(Map.Entry en :allStackTraces.entrySet()){
                Thread key =en.getKey();
                StackTraceElement[] value = en.getValue();
                System.out.println("Thread name is "+ key.getName());
                for(StackTraceElement str: value){
                    System.out.println("\t"+ str.toString());
                }
            }
        }
    }
    
  • 输出结果如下:

关注
打赏
查看更多评论

小志的博客

暂无认证

  • 4浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录