一:建立模拟的死锁代码
二:进入java的bin目录打开jvisualvm.exe
2.1:点击[线程dump]后,有死锁的情况会看到以下三处关键的信息
标记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命令执行完成后,打开浏览器
5:进入浏览器输入 http://localhost:7000/
6:然后点击标红的链接,进入如下界面
7:然后在输入框输oql语句:如 select heap.findObject("0x00000000f0623a48")
0x00000000f0623a48 这个地址则是我们在线程中看到死锁对象的内存id,
然后点击查询结果可以看到下图
7:对比java代码
8:经对比确实是 DeadLockDemo中B变量被线程锁住,然后将其修改即可