jstack命令详解 Java程序员必备:jstack命令解析

栏目:教育 2021-11-25 01:12:47
分享到:

前言

如果有一天,你的Java程序暂停了很长时间,可能是生病了,需要用jstack拍一个片子来分析,以便诊断具体的疾病,比如死锁综合征或者其他疾病比如无限循环。在这篇文章中,让我们一起学习jstack命令~

jstack的功能

jstack的用法

线程状态的基本审查等

实际案例1: jstack分析死锁

实际案例2: jstack分析CPU过高

jstack的功能

Jstack是JVM自带的java栈跟踪工具,用于打印出给定Java进程ID、核心文件和远程调试服务的Java栈信息。

jstack命令用于在当前时间生成虚拟机的线程快照。

线程快照是当前虚拟机中每个线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位导致线程长时间停滞的原因,如线程之间的死锁、循环无休以及请求外部资源导致的长时间等待。

当一个线程暂停时,可以通过jstack检查每个线程的调用栈,就可以知道没有响应的线程在后台做什么,或者在等待什么资源。

如果一个java程序崩溃生成了一个核心文件,可以使用jstack工具获取核心文件的java栈和本机栈的信息,这样就可以很容易地知道java程序是如何崩溃的,程序出了什么问题。

此外,还可以在运行的java程序上附加jstack工具,查看当时运行的java程序的java栈和本机栈的信息。如果运行的Java程序处于挂起状态,jstack非常有用。

jstack的用法

jstack命令的格式如下

生成核心转储的可执行Java可执行文件。

由Core打印的信息的core转储文件

远程调试服务的远程主机名或ip主机名或IP

服务器id唯一id,如果一台主机上有多个远程调试服务

最常用的是

选项参数描述如下:

线程状态的基本审查等

线程状态介绍

Jstack用于生成线程快照。我们需要通过分析线程情况来查看线程状态。拿个小凳子复习一下~

Java语言定义了六种线程池状态:

新:创建后未启动的线程处于此状态,不会出现在转储中。

可运行:包括运行和就绪。当线程打开start方法时,它将进入此状态并在虚拟机中执行。

等待:无限等待另一个线程的具体操作。

定时等待:在有限的时间内等待另一个线程的特定操作。

阻塞:当程序等待进入同步区时,线程会进入这种状态,等待监视器锁定。

End:线程的线程状态已经终止,线程已经执行完毕。

通常,转储文件的线程状态如下:

RUNNABLE,线程正在执行

BLOCKED,线程被阻塞

等待,线程正在等待

监视器监视器锁定

由于Java程序通常是通过多线程运行的,而Java多线程是和监控锁链接在一起的,所以我们在分析线程状态时需要复习Monitor监控锁的知识。

监视器的工作原理图如下:

如果一个线程想要获得监视器,它将首先进入入口集队列,这是等待线程,线程状态是等待监视器入口。

当一个线程成功获得一个对象的监视器时,它进入所有者区域,它被称为活动线程。

如果线程调用等待方法,它将进入等待集队列,这将释放监视器锁,监视器锁也是等待线程,线程状态是inobject.wait。

如果其他线程调用notify/notifyAll,它将唤醒等待集中的一个线程,如果成功,该线程将尝试再次获取监视器锁并进入所有者区域。

转储文件分析的重点

可运行,线程正在执行

僵局,僵局

阻塞,线程被阻塞

停车,停车

锁定,对象被锁定

等待,线程正在等待

等待锁定等待锁定

对象。等待,对象正在等待

等待监视器输入等待获取监视器

等待条件,等待资源,最常见的情况是线程在网络上等待读写

实际案例1: jstack分析死锁问题

什么是死锁?

如何用jstack解决死锁?

什么是死锁?

死锁是指在执行过程中,两个或多个线程因为争夺资源而相互等待的现象。如果没有外力,他们将无法进行。

如何使用jstack解决死锁问题

我们先来看一个会产生死锁的Java程序。源代码如下:

运行结果:

很明显,线程jay和线程罗天只是执行到一半,他们陷入了阻塞等待状态~

Jstack死锁故障排除步骤

在终端输入jsp查看当前运行的java程序

使用jstack -l pid查看线程堆栈信息

分析堆栈信息

在终端输入jsp查看当前运行的java程序

通过使用jps命令获取要监控的进程的pid,我们发现

使用jstack -l pid查看线程堆栈信息

从上图中可以清楚地看到死锁信息:

mythread-罗天等待由mythread-jay线程持有的锁“0x00000000d61ae3a0”。

mythread-jay线程等待由mythread-罗天线程持有的锁“0x00000000d61ae3d0”。

恢复死锁真相

“神话-罗天”线程堆栈信息分析如下:

mythread-罗天的线程处于等待状态,持有“0x00000000d61ae3d0”的锁,等待“0x00000000d61ae3a0”的锁

对“mythread-jay”线程堆栈信息的分析如下:

mythread-罗天的线程处于等待状态,持有“0x 00000000 d61a 3 a 0”的锁,等待“0x 00000000 d61a 3d 0”的锁

实际案例2: jstack分析了CPU过度的问题

来个导致CPU过高的演示程序,无限循环,哈哈~

Jstack分析CPU高步进

顶端

top-惠普pid

jstack pid

jstack -l >/tmp/log.txt

分析堆栈信息

1 .顶部

在服务器上,我们可以通过top命令检查每个进程的cpu使用情况,默认情况下,top命令是从高到低排序的

从上图我们可以找出占用cpu资源最高的pid为21340的java进程,凶手就是它,哈哈!

2.top-惠普pid

使用top -Hp 21340,您可以在此过程中检查每个线程的cpu使用情况,如下所示:

可以发现pid为21350的线程占用的CPU资源最高~,嘻嘻,写在小本子上,然后拿jstack去拍~

3.jstack pid

使用top命令定位cpu利用率高的线程,然后使用jstack pid命令查看当前java进程的堆栈状态。之后,内容如下:

4.jstack -l >/tmp/log.txt

事实上,堆栈信息已经在前三步中出来了。但是一般在生成环境中,我们可以把这些栈信息打成文件,然后仔细分析~

5.分析堆栈信息

我们采用占用大量cpu资源的线程pid,并将pid转换为十六进制值

在线程转储中,每个线程都有一个nid,我们找到相应的nid并发现它一直在运行

这时可以检查代码是否有问题~当然也建议隔一段时间执行一次stack命令,然后得到线程转储。毕竟两次拍摄结果的对比还是比较准确的~

  • 传统武侠小说 传统武侠小说 无穿越、无重生、无金手指 原汁原味

    《鲁》作者:橘子越小。传统武术的名称宏伟而自然。然而,它不会在在线环境中发光。在线文本的标题很简单。可以查一下畅销书排行榜,或者研究一下轻小说的命名习惯,可能会更吸引眼球。介绍异常有规律,来龙去脉安排得很清楚,

    ·21-11-25

  • hpv疫苗年龄 HPV疫苗为什么有年龄限制?中国用上疫苗为何比国外差10年

    说到HPV疫苗,现在我们有多少种HPV疫苗可以选呀?世界各国正在研究的HPV疫苗有N多种,但目前站到台前的,只有三名成员,分别是:2价疫苗、4价疫苗和9价疫苗。所谓的“价”,代表的是疫苗可预防的病毒种类数。2价疫苗可以预防HPV16

    ·21-11-25

  • 得了肝病怎么办 得了肝病怎么办 坚持4点治疗 阻止肝病恶化

    肝病治疗难度大,给患者身心带来双重打击。有些人乱去医院,盲目选择祖传秘方或药方,不仅花费了大部分时间和金钱,还耽误了最佳治疗时间。因此,肝病患者应建立科学规范的治疗关键。 肝病患者的治疗需要坚持4点 1.抗病毒治

    ·21-11-25

  • 韦大卫 他起义被四架战斗机追杀 到大陆又被炮击 后来越狱成功

    “魏大伟”这个名字现在很少有人知道,但在那个时候,他也是一个著名的人物。他被骗到了台湾省,海军和空陆军都怀疑他的身份,想杀了他。冒险起义后,他乘坐蒋纬国的专机飞往大陆,迫降时死于九死一生;他最终保住了性命,在mainland

    ·21-11-25

  • 逆天早餐 3 种泡面逆天新吃法 好吃到直跺脚啊啊啊

    @尘埃粒子- 方便面+牛奶??吃过一次就爱上了这道看似黑暗的美食!难怪这种做法在网上这么流行!这款方便面的汤底绝对是100分。牛奶+泡菜的组合让汤底香醇却不油腻。麻辣拉面奶又香又辣,更别提有多香了~ 可乐,牛奶 泡菜,辣拉面

    ·21-11-25

  • 基里连科 国服第一蓝卡 支撑起一支平民球队的内线防守—安德烈-基里连科

    基里连科 年代背景 安德烈·基里连科在1999年被爵士选入第24顺位。这位著名的俄罗斯篮球运动员被昵称为“AK47”,因为他穿着47号球衣。 AK47,绰号自己人,是最有名的球,一分半钟内四次加冕科比。 职业生涯场均11.8分5.5

    ·21-11-25

  • 德云社照片 那些惊艳的德云社照片

    ▼ “你不管我有没有女朋友,我都不会娶你。” ▼ “虽然我不漂亮, 但是让你快乐是我一生的梦想。" ▼ “人们常说幸福就像夜晚空烟花转瞬即逝 但毕竟这已经足够好了。" ▼ “我从来都不是传奇,但来到这个世界是值

    ·21-11-25

  • 美国大雪 美国东部多地遭受大雪袭击 已致42人遇难(图)

    在弗吉尼亚州的大瀑布,暴风雪停止后,当地居民清理了自家门口2英尺厚的积雪。中新网1月27日电据美国媒体报道,美国东部不少地方近日遭遇大雪袭击。根据美国当局的最新统计,东部12个州和哥伦比亚特区有42人死于与暴风雪有关

    ·21-11-25