java自带的工具Jstack截取进程中的堆栈信息

 更新时间:2016年01月07日 08:43:56   作者:jilodream  
本文给大家记录的是java自带的工具Jstack截取进程中的堆栈信息的方法,非常的实用,有需要的小伙伴可以参考下。

  在Java软件的使用过程中,有时会莫名的出现奇怪的问题。而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里。

  举个例子,当我们在做某个操作时,莫名的会弹出多个警告框,其中有些信息是正常的,有些则不是。对于这些错误的警告信息,我们该如何定位是哪个位置的代码出现了错误弹出的框呢? 我们就需要在弹框以后,去查看软件的各个线程,去查找究竟是哪个线程导致了该问题。可是有时因为环境、时间等问题,我们根本不能拿着IDE去调试, 只能通过工具软件拍下内存快照,然后分析内存信息。

今天介绍一款常用的工具:Jstack

Jstack 是JDK自带的工具,同时也是在JVM性能调优种出镜率非常高的一款软件。所以掌握它是非常有必要的。

Jstack可以生成JVM当前时间点的线程快照。

线程快照就是当前JVM内每一条线程正在执行的方法堆栈的集合。而生成线程快照的主要原因:

1、通过线程快照定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待

2、通过线程快照分析当前执行方法的调用关系来确定异常信息的源头。

它的使用非常简单:

(ps:前提是你已经装有带有Jstack的JDK。同时最好已经设置了环境变量。)

第一步: 通过Windows的任务管理器查看进程的PID

这里简单说下什么是PID:PID就是各进程的身份标识,他是在软件启动后,由操作系统分配的唯一的、用来标识进程身份的一个标识

如图

在进程页签下,查看 > 选择列

勾选PID 然后确定

切到应用程序页签,选择要快照内存的程序。图片中选择的是Android Studio。点击右键转到进程。

这里就查看到 Android Studio对应的PID是 9952

第二步 打开命令行,执行Jstack程序

注意,如果没有成功添加环境变量,那么这里只能在Jstack的路径下执行,否则操作系统无法识别。

如图,这里一般有两个运行参数,用来拍取内存快照,

他们的含义如下:

-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

我们一般使用-l参数就可以满足需要

格式如下 Jstack -l PID >> 123.txt

ps 这里注意下 >>是重定向的意思,也就是将拍取到的快照定向输出到987.txt中。>> 的两次最好保持空格

这样我们就会在命令行路径下生成一个987.txt文件,同时将内存快照写入到这个文本中

如下图:

相关文章

  • Java之打印String对象的地址

    Java之打印String对象的地址

    这篇文章主要介绍了Java之打印String对象的地址,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 详解SpringBoot restful api的单元测试

    详解SpringBoot restful api的单元测试

    本篇文章主要介绍了详解SpringBoot restful api的单元测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • java编程调用存储过程中得到新增记录id号的实现方法

    java编程调用存储过程中得到新增记录id号的实现方法

    这篇文章主要介绍了java编程调用存储过程中得到新增记录id号的实现方法,涉及Java数据库操作中存储过程的相关使用技巧,需要的朋友可以参考下
    2015-10-10
  • Java实现二维码QRCode的编码和解码与示例解析

    Java实现二维码QRCode的编码和解码与示例解析

    本文主要介绍Java实现二维码QRCode的编码和解码,这里给大家一个小示例以便理解,有需要的小伙伴可以参考下
    2016-08-08
  • 深入JVM剖析Java的线程堆栈

    深入JVM剖析Java的线程堆栈

    这篇文章主要介绍了深入JVM剖析Java的线程堆栈,Java中的堆内存和堆栈原理的应用等知识是深入学习Java的重点,需要的朋友可以参考下
    2015-07-07
  • Java中一个线程执行死循环有什么后果

    Java中一个线程执行死循环有什么后果

    这篇文章主要为大家详细介绍了Java中一个线程执行死循环有什么后果,当一个线程在执行死循环时会影响另外一个线程吗,下面为大家揭晓
    2016-05-05
  • 深入理解Spring Cloud Zuul过滤器

    深入理解Spring Cloud Zuul过滤器

    这篇文章主要给大家介绍了关于Spring Cloud Zuul过滤器的相关资料,通过阅读本文您将了解:Zuul过滤器类型与请求生命周期、如何编写Zuul过滤器、如何禁用Zuul过滤器和Spring Cloud为Zuul编写的过滤器及其功能,需要的朋友可以参考下。
    2017-02-02
  • Windows10安装IDEA 2020.1.2的方法步骤

    Windows10安装IDEA 2020.1.2的方法步骤

    这篇文章主要介绍了Windows10安装IDEA 2020.1.2的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot使用Captcha生成验证码

    SpringBoot使用Captcha生成验证码

    这篇文章主要介绍了SpringBoot如何使用Captcha生成验证码,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下
    2021-04-04
  • Java防止短信盗刷和轰炸的解决方案

    Java防止短信盗刷和轰炸的解决方案

    短信盗刷和短信轰炸是项目开发中必须要解决的问题之一,它的优先级不亚于 SQL 注入的问题,今天我们就来看下,如何防止这个问题,需要的朋友可以参考下
    2024-02-02

最新评论