java自己的工具Jstack截取进程中的堆栈信息
在使用Java软件的过程中,奇怪的问题有时会莫名其妙地出现。但是,这些问题无法通过日志信息找到。这时候我们需要看进程中线程的栈调用关系,分析问题出在哪里。
比如我们在做某件事情的时候,会莫名其妙地弹出几个警告框,有些是正常的,有些则不是。对于这些错误警告消息,我们如何定位代码弹出错误的框?我们需要在播放完盒子后查看软件的每个线程,找出是哪个线程导致了问题。但是,有时候由于环境、时间等问题,我们根本无法用IDE进行调试。我们只能通过工具和软件对内存进行快照,然后对内存信息进行分析。
今天,我介绍一个常用的工具:Jstack。
Jstack是JDK自带的工具,也是JVM性能调优中出现率非常高的软件。所以掌握它是非常必要的。
Jstack可以在JVM的当前时间点生成线程快照。
线程快照是当前JVM中每个线程正在执行的方法堆栈的集合。生成线程快照的主要原因是:
1.通过线程快照查找导致线程长时间暂停的原因,如线程之间的死锁、无休止的循环以及请求外部资源导致的长时间等待。
2.通过线程快照分析当前执行方法的调用关系,确定异常信息的来源。
使用起来非常简单:
(ps:前提是你已经用Jstack安装了JDK。同时,优选地设置环境变量。)
第一步:通过Windows的任务管理器检查进程的PID。
这里,什么是PID :PID是每个过程的标识。它是操作系统分配的唯一标识,用于在软件启动后标识进程标识。
数字
在进程选项卡下,查看选择列。
检查PID并确认。
转到“应用程序”选项卡,选择对内存进行快照的程序。图中选择安卓工作室。右键单击可转到进程。
这里可以看到安卓Studio对应的PID是9952。
第二步是打开命令行,执行Jstack程序。
注意,如果环境变量添加不成功,只能在Jstack的路径下执行,否则操作系统不会识别。
如图所示,这里一般有两个运行参数,用来拍摄内存快照。
它们有以下含义:
-l长清单将打印出额外的锁信息,jstack -l pid可用于观察死锁发生时的锁保持情况。
-m混合模式,不仅输出Java栈信息,还输出C/C栈信息(如Native方法)。
一般来说,我们可以通过使用-l参数来满足需求。
格式为jstack-lpid123.txt。
这里ps关注重定向的含义,就是拍摄的快照定向输出到987.txt最好保留两次空格。
这样,我们将在命令行路径下生成一个987.txt文件,同时将内存快照写入该文本。
下图:
版权声明:java自己的工具Jstack截取进程中的堆栈信息是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。