jstack、jmc、jhat工具使用详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

jstack、jmc、jhat⼯具使⽤详解jstack:
其实在JDK中还有另⼀个专门查看或导出Java应⽤程序中线程的堆栈信息jstack,具体瞅下它的使⽤:
咱们还是以之前死锁的MyTest3为例试⼀下该⼯具:
xiongweideMacBook-Pro:CoffeeMachineClient xiongwei$ jps -l
96336 uncher.daemon.bootstrap.GradleDaemon
94336
98744 sun.tools.jps.Jps
17418
98733 uncher
96495 uncher.daemon.bootstrap.GradleDaemon
98734 com.jvm.memory.MyTest3
xiongweideMacBook-Pro:CoffeeMachineClient xiongwei$ jstack 98734
2019-04-12 16:32:16
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode):
"Attach Listener" #12 daemon prio=9 os_prio=31 tid=0x00007fb1d7882000 nid=0x4003 waiting on condition [0x0000000000000000]
ng.Thread.State: RUNNABLE
"DestroyJavaVM" #11 prio=5 os_prio=31 tid=0x00007fb1d81da800 nid=0x1703 waiting on condition [0x0000000000000000]
ng.Thread.State: RUNNABLE
"Thread-B" #10 prio=5 os_prio=31 tid=0x00007fb1d88a4000 nid=0x4703 waiting for monitor entry [0x0000700007a49000]
ng.Thread.State: BLOCKED (on object monitor)
at com.jvm.memory.A.method(MyTest3.java:17)
- waiting to lock <0x00000007958c2f10> (a ng.Class for com.jvm.memory.A)
at com.jvm.memory.B.method(MyTest3.java:35)
- locked <0x0000000795a0fcb0> (a ng.Class for com.jvm.memory.B)
at mbda$main$1(MyTest3.java:10)
at com.jvm.memory.MyTest3$$Lambda$2/1989780873.run(Unknown Source)
at ng.Thread.run(Thread.java:745)
"Thread-A" #9 prio=5 os_prio=31 tid=0x00007fb1d7881000 nid=0x4803 waiting for monitor entry [0x0000700007946000]
ng.Thread.State: BLOCKED (on object monitor)
at com.jvm.memory.B.method(MyTest3.java:31)
- waiting to lock <0x0000000795a0fcb0> (a ng.Class for com.jvm.memory.B)
at com.jvm.memory.A.method(MyTest3.java:21)
- locked <0x00000007958c2f10> (a ng.Class for com.jvm.memory.A)
at mbda$main$0(MyTest3.java:6)
at com.jvm.memory.MyTest3$$Lambda$1/2093631819.run(Unknown Source)
at ng.Thread.run(Thread.java:745)
"Service Thread" #8 daemon prio=9 os_prio=31 tid=0x00007fb1d8021000 nid=0x3b03 runnable [0x0000000000000000]
ng.Thread.State: RUNNABLE
"C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007fb1d9033000 nid=0x3903 waiting on condition [0x0000000000000000] ng.Thread.State: RUNNABLE
"C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007fb1d7828800 nid=0x3803 waiting on condition [0x0000000000000000] ng.Thread.State: RUNNABLE
"C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007fb1d9000000 nid=0x3703 waiting on condition [0x0000000000000000] ng.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007fb1d7827000 nid=0x4b07 runnable [0x0000000000000000]
ng.Thread.State: RUNNABLE
"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fb1d800d800 nid=0x3003 in Object.wait() [0x0000700007231000]
ng.Thread.State: WAITING (on object monitor)
at ng.Object.wait(Native Method)
- waiting on <0x0000000795588ee0> (a ng.ref.ReferenceQueue$Lock)
at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x0000000795588ee0> (a ng.ref.ReferenceQueue$Lock)
at ng.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at ng.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fb1d800c800 nid=0x2f03 in Object.wait() [0x000070000712e000]
ng.Thread.State: WAITING (on object monitor)
at ng.Object.wait(Native Method)
- waiting on <0x0000000795586b50> (a ng.ref.Reference$Lock)
at ng.Object.wait(Object.java:502)
at ng.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x0000000795586b50> (a ng.ref.Reference$Lock)
at ng.ref.Reference$ReferenceHandler.run(Reference.java:153)
"VM Thread" os_prio=31 tid=0x00007fb1d7815800 nid=0x5403 runnable
"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fb1d900d000 nid=0x2007 runnable
"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fb1d7801000 nid=0x1e03 runnable
"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fb1d7812000 nid=0x2a03 runnable
"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fb1d7812800 nid=0x2c03 runnable
"VM Periodic Task Thread" os_prio=31 tid=0x00007fb1d7829800 nid=0x3d03 waiting on condition
JNI global references: 309
Found one Java-level deadlock:
=============================
"Thread-B":
waiting to lock monitor 0x00007fb1d90230b8 (object 0x00000007958c2f10, a ng.Class),
which is held by "Thread-A"
"Thread-A":
waiting to lock monitor 0x00007fb1d90259f8 (object 0x0000000795a0fcb0, a ng.Class),
which is held by "Thread-B"
Java stack information for the threads listed above:
===================================================
"Thread-B":
at com.jvm.memory.A.method(MyTest3.java:17)
- waiting to lock <0x00000007958c2f10> (a ng.Class for com.jvm.memory.A)
at com.jvm.memory.B.method(MyTest3.java:35)
- locked <0x0000000795a0fcb0> (a ng.Class for com.jvm.memory.B)
at mbda$main$1(MyTest3.java:10)
at com.jvm.memory.MyTest3$$Lambda$2/1989780873.run(Unknown Source)
at ng.Thread.run(Thread.java:745)
"Thread-A":
at com.jvm.memory.B.method(MyTest3.java:31)
- waiting to lock <0x0000000795a0fcb0> (a ng.Class for com.jvm.memory.B)
at com.jvm.memory.A.method(MyTest3.java:21)
- locked <0x00000007958c2f10> (a ng.Class for com.jvm.memory.A)
at mbda$main$0(MyTest3.java:6)
at com.jvm.memory.MyTest3$$Lambda$1/2093631819.run(Unknown Source)
at ng.Thread.run(Thread.java:745)
Found 1 deadlock.
jmc:Java Mission Control(Java任务控制)
它也是⼀体化的可视化⼯具,相⽐jconsole或jvisualvm,它呈现的功能更多,⽽且还可以在程序运⾏期会不断实时的呈现变更的数据,下⾯瞅下它,还是以MyTest程序来实验:
其中⾥⾯提到了⼀个Java飞⾏记录器:
JFR:Java Flight Recorder,它是可以实时的获取进程的统计数据。

咱们简单来使⽤⼀下它:
先来单击瞅下"MBean服务器":
是不是看到如此华丽的界⾯眼前⼀亮,⽽且还是实时跟踪的,确实是够强⼤,继续⼤致看⼀下:
其中上⾯出了⼀个元空间:
相当于将jcmd集成到这个⼯具⾥⾯了,接下来看⼀下飞⾏记录器:
我的天呀,⽐之前看到的界⾯还丰富好看,真的好强⼤,随便瞅⼀瞅其它的:
可以看到它⾥⾯还有很多功能切换:
另外对于JFR是可以⽤jcmd命令⽣成出飞⾏记录器的记录⽂件的,如下:
这⾥我们运⾏之前元空间的⽰例来⽤此⼯具来观察⼀下:
⽽且使⽤量会时时的进⾏变化:
也可以看到最⼤的元空间是200MB,正是我们在JVM上设置的⼤⼩参数:
然后当元空间溢出之后,则可以在jmc⼯具给出了⼀个断开提⽰:
关于该⼯具也只是做了⼀些基本的学习,具体在实际中的使⽤还得⾃⼰来实践,还是相当之强⼤的。

jhat:可以⽤来分析堆转储⽂件
这⾥得⽤之前的这个程序来演⽰了:
该程序会导致堆内存溢出,同时我们在JVM中设置了这样的参数:
运⾏,来看当堆内存溢出时⽣成的转储⽂件:
我们知道可以⽤jvisualvm可视化的⼯具来分析,那如果可视化的⼯具在实际场景中⽤不了怎么办呢?此时jhat就可以发挥作⽤了,咱们⽤它来分析⼀下该转储⽂件:
所以咱们可以⽤浏览器访问⼀下:
其中重点看⼀下我们的MyTest1,点击查看细节:
其中还可以看到也有OQL:
这⾥咱们简单的使⽤⼀下,先来感受下,具体详细的⽤法待之后有需要再现查,⽐如我们想查询当前是ClassLoader⼦类的名字,OQL可以这样写:
⽽我们在jvisualvm可视化的⼯具中也有OQL的查询,咱们在它⾥⾯来试⼀下:
⾄此,关于JDK的⼀些关键⼯具的使⽤就暂且学习到这了,在未来的JVM学习中这些⼯具是会派上⽤场的,这些⼯具的使⽤是⽐较简单的,但是如果不过⼀遍你都不知道有这些⼯具的存在,实际⼯作中其实就是怕有现成的东东可以解决某个实际问题,但是由于知识的局限性完全不知道有这么个东东,那。

是不是会很痛苦。

相关文档
最新文档