利用jvisualvm监控分析死锁线程并定位死锁的对象

一:建立模拟的死锁代码

 

利用jvisualvm监控分析死锁线程并定位死锁的对象_第1张图片

:进入java的bin目录打开jvisualvm.exe

利用jvisualvm监控分析死锁线程并定位死锁的对象_第2张图片

2.1:点击[线程dump]后,有死锁的情况会看到以下三处关键的信息

利用jvisualvm监控分析死锁线程并定位死锁的对象_第3张图片

标记1:代表 发生死锁的所在类

标记2:代表锁住的对象的内存地址,如:0x00000000f0623a48(这个比较重要,可以用来定位死锁的原因)

标记3:代表整个程序中有几处死锁

三:使用oql对象查询语句分被死锁对象的所在代码

1:Windows下进入java的bin目录(备注:liunx下与windows大致相同,使用shell命令即可)

2:使用jps查看进程(jvisualvm工具已经为我们展示了对应程序的id,此步可忽略)

3:使用命令  jmap -dump:live,file=test.map 7628 生成分析文件

4:启用jhat,使用如下命令,其中 test.map是 jmap生成的文件,当jhat命令执行完成后,打开浏览器

利用jvisualvm监控分析死锁线程并定位死锁的对象_第4张图片

5:进入浏览器输入 http://localhost:7000/

 

利用jvisualvm监控分析死锁线程并定位死锁的对象_第5张图片

6:然后点击标红的链接,进入如下界面

利用jvisualvm监控分析死锁线程并定位死锁的对象_第6张图片

7:然后在输入框输oql语句:如  select heap.findObject("0x00000000f0623a48")

0x00000000f0623a48 这个地址则是我们在线程中看到死锁对象的内存id,

然后点击查询结果可以看到下图

利用jvisualvm监控分析死锁线程并定位死锁的对象_第7张图片

7:对比java代码

利用jvisualvm监控分析死锁线程并定位死锁的对象_第8张图片

8:经对比确实是 DeadLockDemoB变量被线程锁住,然后将其修改即可

 

你可能感兴趣的:(java)