JVM系列(五)、常用命令(下)


1. jmap

jmap (Memory Map for Java):命令用于生成堆转存快照。如果不使用jmap命令,想要获取Java堆转存快照,还有一些比较”暴力”的手段:-XX:HeapDumpOnOutOfMemoryError 参数,可以让虚拟机在出现OOM异常之后自动生成dump文件。
在Linux上面是可以使用jmap的全部功能,但是在Windows平台上只能使用jmap的部分功能

  1. -dump 生成dump文件和查看每个类的实例
  2. -histo 统计信息,类、实例数量,合计容量

1.1 命令格式

jmap [option] LVMID

1.2 参数说明

参数 说明
finalizerinfo 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
heap 显示Java堆详细信息
histo[:live] 打印堆的对象统计,包括对象数、内存大小等等。(带上live则只统计活对象,因此dump:live前会进行full gc,所以不加live的堆大小要大于加live堆的大小 )
clstats 打印类加载器信息
dump 生成堆转储快照
F 当-dump没有响应时,强制生成dump快照

1.3 使用示例

1.3.1 jmap -finalizerinfo

jmap -finalizerinfo:显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象

[root@node1 ~]# jmap -finalizerinfo 3446
Attaching to process ID 3446, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Number of objects pending for finalization: 0

可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

1.3.2 jmap -heap

jmap -heap 3446:显示Java堆详细信息

[root@node1 ~]# jmap -heap 3446
Attaching to process ID 3446, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration: #堆内存初始化配置
   MinHeapFreeRatio         = 40 #对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio         = 70 #对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize              = 1048576000 (1000.0MB) #对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 10485760 (10.0MB) #对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize               = 349503488 (333.3125MB) #对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize                  = 20971520 (20.0MB) #对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio                 = 2 #对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8 #对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   MetaspaceSize            = 21807104 (20.796875MB) #分配给类元数据空间的初始大小. 此值为估计值. MetaspaceSize设置得过大会延长垃圾回收时间. 垃圾回收过后, 引起下一次垃圾回收的类元数据空间的大小可能会变大
   CompressedClassSpaceSize = 1073741824 (1024.0MB) #类指针压缩空间大小, 默认为1G
   MaxMetaspaceSize         = 17592186044415 MB #是分配给类元数据空间的最大值, 超过此值就会触发Full GC. 此值仅受限于系统内存的大小, JVM会动态地改变此值
   G1HeapRegionSize         = 0 (0.0MB) #G1区块的大小, 取值为1M至32M. 其取值是要根据最小Heap大小划分出2048个区块.

Heap Usage: #堆内存分布
New Generation (Eden + 1 Survivor Space): #新生代
   capacity = 9437184 (9.0MB) #新生代总容量
   used     = 3354944 (3.19952392578125MB) #新生代已使用
   free     = 6082240 (5.80047607421875MB) #新生代剩余空间
   35.550265842013886% used
Eden Space: #Eden区内存分布
   capacity = 8388608 (8.0MB) #Eden区总容量
   used     = 2306368 (2.19952392578125MB) #Eden区已使用
   free     = 6082240 (5.80047607421875MB) #Eden区剩余空间
   27.494049072265625% used #Eden区使用比率
From Space: #其中一个Survivor区的内存分布
   capacity = 1048576 (1.0MB) #区总容量
   used     = 1048576 (1.0MB) #已使用
   free     = 0 (0.0MB) #剩余空间
   100.0% used #使用比率
To Space: #另一个Survivor区的内存分布
   capacity = 1048576 (1.0MB) #区总容量
   used     = 0 (0.0MB) #已使用
   free     = 1048576 (1.0MB) #剩余空间
   0.0% used #使用比率
tenured generation: #老年代
   capacity = 20971520 (20.0MB) #老年代区总容量
   used     = 4618472 (4.404518127441406MB) #老年代已使用
   free     = 16353048 (15.595481872558594MB) #老年代剩余空间
   22.02259063720703% used #老年代使用比率

5267 interned Strings occupying 403696 bytes.

1.3.3 jmap -histo

jmap -histo 3446 | more

# 序号    实例数量            字节数   完全限定的类名
 num     #instances         #bytes  class name
----------------------------------------------
   1:          4159        3311200  [B
   2:         13270        1360064  [C
   3:          1300         648232  [I
   4:         25101         602424  java.lang.Long
   5:          2693         304040  java.lang.Class
   6:         11566         277584  java.lang.String
   7:          2511         153064  [Ljava.lang.Object;
   8:          4224         135168  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
   9:          2785         133680  java.util.HashMap
  ......
  1168:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
  Total        105510        8366248
jmap -histo:live 3446 | more #统计前先进行full GC

# 序号    实例数量            字节数   完全限定的类名
num     #instances         #bytes  class name
----------------------------------------------
   1:         10201        1057120  [C
   2:          1503        1038496  [B
   3:          2680         302688  java.lang.Class
   4:          2505         247224  [I
   5:          9798         235152  java.lang.String
   6:          2283         140768  [Ljava.lang.Object;
   7:          2361          75552  java.util.concurrent.ConcurrentHashMap$Node
   8:          1888          60416  java.util.HashMap$Node
   9:           537          47256  java.lang.reflect.Method
   ......
   1064:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
   Total         52301        3922912
符号 说明
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象

1.3.4 jmap -clstats

jmap -clstats 3446:打印类加载信息

[root@node1 ~]# jmap -clstats 3446
Attaching to process ID 3446, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness..................................liveness analysis may be inaccurate ...

#加载器名称         已加载类个数  占用空间      父类加载器              是否存活?  类型信息
class_loader        classes    bytes       parent_loader           alive?    type
<bootstrap>           1677     2995244        null                  live    <internal>
0x00000000d6680e18    602      1117983        0x00000000d6680f40    live    sun/misc/Launcher$AppClassLoader@0x000000010000f8d8
0x00000000d6680e78    1        880            null                  dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000d6681338    1        773            null                  dead    javax/management/remote/rmi/NoCallStackClassLoader@0x00000001000c96e8
0x00000000d66d6dd8    0        0              0x00000000d6680e18    live    java/util/ResourceBundle$RBClassLoader@0x0000000100100828
0x00000000d677e7d0    1        1474           null                  dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000d677e960    1        880            null                  dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000d6680f40    4        4572           null                  live    sun/misc/Launcher$ExtClassLoader@0x000000010000fc80
0x00000000d6681410    1        742            null                  dead    javax/management/remote/rmi/NoCallStackClassLoader@0x00000001000c96e8
0x00000000d677e898    1        880            null                  dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000d677ea28    1        880            null                  dead    sun/reflect/DelegatingClassLoader@0x000000010000a028

total = 11    2290    4124308        N/A        alive=4, dead=7        N/A

1.3.5 jmap -dump

-dump:所有对象在堆中的分布情况

  • 命令格式

-dump::live,format=b,file= pid

  • 参数说明:

    参数 说明
    live 只保存存活的对象; 如果没指定live 则将堆中的所有对象保存
    format=b 二进制格式
    file=<file> 文件路径

我们也可以使用VM 参数 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=路径 当出现OOM时转存内存快照。

#dump 所有对象在堆中的分布情况
[root@node1 opt]# jmap -dump:format=b,file=/opt/jamp_dump.hprof 3446
Dumping heap to /opt/jamp_dump.hprof ...
Heap dump file created
#加:live 参数 dump 存活对象在队中的分布情况
[root@node1 opt]# jmap -dump:live,format=b,file=/opt/jamp_live_dump.hprof 3446
Dumping heap to /opt/jamp_live_dump.hprof ...
Heap dump file created
[root@node1 opt]# ll -rth
-rw------- 1 root root 7.7M 1月  30 21:11 jamp_dump.hprof
-rw------- 1 root root 6.7M 1月  30 21:12 jamp_live_dump.hprof

*.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。

1.3.6 jmap -F

jmap -dump:live,format=b,file=/opt/jamp_live_dump2.hprof -F 3446:当-dump没有响应时,强制生成dump快照

[root@node1 opt]# jmap -dump:live,format=b,file=/opt/jamp_live_dump2.hprof -F 3446
Attaching to process ID 3446, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Dumping heap to /opt/jamp_live_dump2.hprof ...

Heap dump file created
[root@node1 opt]#
[root@node1 opt]# ll -rth
-rw------- 1 root root 7.7M 1月  30 21:11 jamp_dump.hprof
-rw------- 1 root root 6.7M 1月  30 21:12 jamp_live_dump.hprof
-rw-r--r-- 1 root root 6.7M 1月  30 21:17 jamp_live_dump2.hprof

2. jhat

jhat(JVM Heap Analysis Tool):常与jmap搭配使用,用来分析jmap生成的堆转存快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。

  • 特点:
    • jhat分析工具是一个耗时而且消耗硬件资源的过程
    • jhat的分析功能相对来说比较简陋

2.1 命令格式

jhat [dumpfile]

2.2 参数说明

参数 说明
-J <flag> 因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.
-port <port> 设置 jhat HTTP server 的端口号. 默认值 7000.>
-version 启动后只显示版本信息就退出>
-stack false or true
关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.>
-refs false or true 关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。>
-exclude exclude-file 指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。>
-baseline exclude-file 指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.>
-debug int 设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.>

2.3 使用示例

2.3.1 jhat -J

hnbiandeMacBook-Pro:MyJava hnbian$ jhat -J-Xmx256m -port 7001 /Users/hnbian/Desktop/jamp_live_dump.hprof
Reading from jamp_live_dump.hprof...
Dump file created Thu Jan 30 21:12:03 GMT+08:00 2020
Snapshot read, resolving...
Resolving 50639 objects...
Chasing references, expect 10 dots..........
Eliminating duplicate references..........
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

中间的-J-Xmx512m是在dump快照很大的情况下分配512M内存去启动HTTP服务器,运行完之后就可在浏览器打开Http://localhost:7000进行快照分析 堆快照分析主要在最后面的Heap Histogram里,里面根据class列出了dump的时候所有存活对象。

分析同样一个dump快照,MAT需要的额外内存比jhat要小的多的多,所以建议使用MAT来进行分析,当然也看个人偏好。

All classes including platform
Show all members of the rootset
Show instance counts for all classes (including platform)
Show instance counts for all classes (excluding platform)
Show heap histogram
Show finalizer summary
Execute Object Query Language (OQL) query

dump快照

2.3.2 jhat -port

hnbiandeMacBook-Pro:MyJava hnbian$ jhat -J-Xmx256m -port 7001 /Users/hnbian/Desktop/jamp_live_dump.hprof
Reading from /Users/hnbian/Desktop/jamp_live_dump.hprof...
Dump file created Thu Jan 30 21:12:03 CST 2020
Snapshot read, resolving...
Resolving 50639 objects...
Chasing references, expect 10 dots..........
Eliminating duplicate references..........
Snapshot resolved.
Started HTTP server on port 7001
Server is ready.

dump快照修改访问端口

2.3.3 jhat -version

jhat -version:显示jhat版本信息

hnbiandeMacBook-Pro:MyJava hnbian$ jhat -version
jhat version 2.0 (java version 1.8.0_191)

2.3.1 jhat -stack


hnbiandeMacBook-Pro:MyJava hnbian$ jhat -stack false /Users/hnbian/Desktop/jamp_live_dump.hprof
Reading from /Users/hnbian/Desktop/jamp_live_dump.hprof...
Dump file created Thu Jan 30 21:12:03 CST 2020
Snapshot read, resolving...
Resolving 50639 objects...
Chasing references, expect 10 dots..........
Eliminating duplicate references..........
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
^ChnbiandeMacBook-Pro:MyJava hnbian$
hnbiandeMacBook-Pro:MyJava hnbian$ jhat -stack true /Users/hnbian/Desktop/jamp_live_dump.hprof
Reading from /Users/hnbian/Desktop/jamp_live_dump.hprof...
Dump file created Thu Jan 30 21:12:03 CST 2020
Snapshot read, resolving...
Resolving 50639 objects...
Chasing references, expect 10 dots..........
Eliminating duplicate references..........
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

2.3.2 jhat -refs

hnbiandeMacBook-Pro:MyJava hnbian$ jhat -refs true /Users/hnbian/Desktop/jamp_live_dump.hprof
Reading from /Users/hnbian/Desktop/jamp_live_dump.hprof...
Dump file created Thu Jan 30 21:12:03 CST 2020
Snapshot read, resolving...
Resolving 50639 objects...
Chasing references, expect 10 dots..........
Eliminating duplicate references..........
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
^ChnbiandeMacBook-Pro:MyJava hnbian$
hnbiandeMacBook-Pro:MyJava hnbian$ jhat -refs false /Users/hnbian/Desktop/jamp_live_dump.hprof
Reading from /Users/hnbian/Desktop/jamp_live_dump.hprof...
Dump file created Thu Jan 30 21:12:03 CST 2020
Snapshot read, resolving...
Resolving 50639 objects...
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

2.3.6 jhat -debug

设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.>

jhat -J-Xmx256m -debug 1 /Users/hnbian/Desktop/jamp_live_dump.hprof
    Read heap sub-record type 5 at position 0x6aa352
    Read heap sub-record type 5 at position 0x6aa35b
    ......
    Read heap sub-record type 5 at position 0x6aa364
    Finished heap sub-records.
    Finished processing instances in heap dump.
Snapshot read, resolving...
Resolving 50639 objects...
Chasing references, expect 10 dots..........
Eliminating duplicate references..........
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

2.4 页面信息说明

对于jhat启动后显示的html页面中功能:
All classes including platform
Show all members of the rootset
Show instance counts for all classes (including platform)
Show instance counts for all classes (excluding platform)
Show heap histogram
Show finalizer summary
Execute Object Query Language (OQL) query

(1)显示出堆中所包含的所有的类
显示出堆中所包含的所有的类

(2)从根集能引用到的对象
从根集能引用到的对象

(3)显示所有类的实例数量(包括平台)
显示所有类的实例数量(包括平台)

(4)显示所有类的实例数量(不包括平台)
显示所有类的实例数量(不包括平台)

(5)堆实例的分布表
堆实例的分布表

(6)展示终结器汇总
展示终结器汇总

(7)执行对象查询语句
执行对象查询语句

3. jstack

jstack(Stack Trace for Java):用于生成虚拟机当前时刻的线程快照 (一般称为ThreadDump 或者Javacore文件)

线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等,都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

3.1 命令格式

jstack [option] LVMID

3.2 参数说明

参数 说明
-F 当正常输出请求不被响应时,强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈

3.3 使用示例

3.3.1 jstack -F

[root@node1 ~]# jstack -F 3446
Attaching to process ID 3446, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Deadlock Detection:

No deadlocks found.

Thread 31103: (state = BLOCKED)


Thread 17335: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Interpreted frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Interpreted frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=24, line=1081 (Interpreted frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1, line=809 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1134 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)


Thread 17334: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Interpreted frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Interpreted frame)
 - java.util.concurrent.LinkedBlockingQueue.take() @bci=29, line=442 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1134 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
 ......

结果分析详细说明

3.3.2 jstack -l

[root@node1 ~]# jstack -l 3446
2020-01-30 21:38:26
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.191-b12 mixed mode):

"Attach Listener" #30 daemon prio=9 os_prio=0 tid=0x00007f905001e800 nid=0x797f waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"Connector-Scheduler-482f8f11" #28 prio=5 os_prio=0 tid=0x00007f905000b800 nid=0x43b7 waiting on condition [0x00007f9069491000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d687c930> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

"NIOWorkerThread-2" #27 daemon prio=5 os_prio=0 tid=0x00007f9048033800 nid=0x43b6 waiting on condition [0x00007f9069592000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d687cb70> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

...

"ContainerManagerTask" #25 daemon prio=5 os_prio=0 tid=0x00007f90804fb800 nid=0xd95 in Object.wait() [0x00007f9069794000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.util.TimerThread.mainLoop(Timer.java:552)
    - locked <0x00000000d687cfc0> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:505)

   Locked ownable synchronizers:
    - None

"ProcessThread(sid:0 cport:2181):" #24 prio=5 os_prio=0 tid=0x00007f90804f9800 nid=0xd94 waiting on condition [0x00007f9069895000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d687d1a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.zookeeper.server.PrepRequestProcessor.run(PrepRequestProcessor.java:134)

   Locked ownable synchronizers:
    - None

"SyncThread:0" #23 prio=5 os_prio=0 tid=0x00007f90804f7000 nid=0xd93 waiting on condition [0x00007f9069996000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d687d3c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.zookeeper.server.SyncRequestProcessor.run(SyncRequestProcessor.java:109)

   Locked ownable synchronizers:
    - None

"SessionTracker" #22 prio=5 os_prio=0 tid=0x00007f90804ef000 nid=0xd92 waiting on condition [0x00007f9069a97000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at org.apache.zookeeper.server.SessionTrackerImpl.run(SessionTrackerImpl.java:151)

   Locked ownable synchronizers:
    - None

"ConnnectionExpirer" #19 prio=5 os_prio=0 tid=0x00007f90804e0800 nid=0xd91 waiting on condition [0x00007f9069b98000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at org.apache.zookeeper.server.NIOServerCnxnFactory$ConnectionExpirerThread.run(NIOServerCnxnFactory.java:574)

   Locked ownable synchronizers:
    - None

"NIOServerCxnFactory.AcceptThread:0.0.0.0/0.0.0.0:2181" #21 daemon prio=5 os_prio=0 tid=0x00007f90804df000 nid=0xd90 runnable [0x00007f9069c99000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    - locked <0x00000000d687d998> (a sun.nio.ch.Util$3)
    - locked <0x00000000d687d9a8> (a java.util.Collections$UnmodifiableSet)
    - locked <0x00000000d687d950> (a sun.nio.ch.EPollSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
    at org.apache.zookeeper.server.NIOServerCnxnFactory$AcceptThread.select(NIOServerCnxnFactory.java:229)
    at org.apache.zookeeper.server.NIOServerCnxnFactory$AcceptThread.run(NIOServerCnxnFactory.java:205)

   Locked ownable synchronizers:
    - None

"Session-HouseKeeper-1d29cf23" #18 prio=5 os_prio=0 tid=0x00007f9080478800 nid=0xd8e waiting on condition [0x00007f9069e9b000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d687dd78> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

"qtp1798286609-17" #17 prio=5 os_prio=0 tid=0x00007f9080461000 nid=0xd8d waiting on condition [0x00007f9069f9c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d6790bb8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
    at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:727)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

......

"RMI TCP Accept-0" #9 daemon prio=5 os_prio=0 tid=0x00007f908027d000 nid=0xd81 runnable [0x00007f906aca5000]
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
    at java.net.ServerSocket.implAccept(ServerSocket.java:545)
    at java.net.ServerSocket.accept(ServerSocket.java:513)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:405)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:377)
    at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
    - None

"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007f90800b5800 nid=0xd80 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f90800b2000 nid=0xd7f waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

......

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f90800ae800 nid=0xd7d runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f908007b800 nid=0xd7c in Object.wait() [0x00007f906befd000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
    - locked <0x00000000d66bc748> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

   Locked ownable synchronizers:
    - None

"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f9080079000 nid=0xd7b in Object.wait() [0x00007f906bffe000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
    - locked <0x00000000d66bc900> (a java.lang.ref.Reference$Lock)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

   Locked ownable synchronizers:
    - None

"main" #1 prio=5 os_prio=0 tid=0x00007f908000a800 nid=0xd79 waiting on condition [0x00007f9086c6e000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d6790ec8> (a java.util.concurrent.CountDownLatch$Sync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
    at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:162)
    at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:106)
    at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:128)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:82)

   Locked ownable synchronizers:
    - None

"VM Thread" os_prio=0 tid=0x00007f908006f000 nid=0xd7a runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007f9080292800 nid=0xd82 waiting on condition

JNI global references: 267

3.3.3 jstack -m

[root@node1 ~]# jstack -m 3446
Attaching to process ID 3446, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Deadlock Detection:

No deadlocks found.

----------------- 3449 -----------------
0x00007f908684a945    __pthread_cond_wait + 0xc5
0x00007f9085b1b5fb    Unsafe_Park + 0x9b
0x00007f90710183a7    * sun.misc.Unsafe.park(boolean, long) bci:0 (Interpreted frame)
0x00007f9071007ffd    * java.util.concurrent.locks.LockSupport.park(java.lang.Object) bci:14 line:175 (Interpreted frame)
0x00007f9071007ffd    * java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt() bci:1 line:836 (Interpreted frame)
0x00007f90710077d0    * java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(int) bci:72 line:997 (Interpreted frame)
0x00007f9071007ffd    * java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(int) bci:24 line:1304 (Interpreted frame)
0x00007f9071007ffd    * java.util.concurrent.CountDownLatch.await() bci:5 line:231 (Interpreted frame)
0x00007f9071007ffd    * org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(org.apache.zookeeper.server.ServerConfig) bci:246 line:162 (Interpreted frame)
0x00007f9071007ffd    * org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(java.lang.String[]) bci:49 line:106 (Interpreted frame)
0x00007f9071007ffd    * org.apache.zookeeper.server.ZooKeeperServerMain.main(java.lang.String[]) bci:10 line:64 (Interpreted frame)
0x00007f9071007ffd    * org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(java.lang.String[]) bci:81 line:128 (Interpreted frame)
0x00007f9071007ffd    * org.apache.zookeeper.server.quorum.QuorumPeerMain.main(java.lang.String[]) bci:10 line:82 (Interpreted frame)
0x00007f90710004e7    <StubRoutines>
0x00007f90857012db    _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0xddb
0x00007f908574c121    _ZL17jni_invoke_staticP7JNIEnv_P9JavaValueP8_jobject11JNICallTypeP10_jmethodIDP18JNI_ArgumentPusherP6Thread.isra.96.constprop.117 + 0x1e1
0x00007f908574e38b    jni_CallStaticVoidMethod + 0x15b
0x00007f908662f82c    JavaMain + 0xa3c
----------------- 3450 -----------------
0x00007f908684acf2    __pthread_cond_timedwait + 0x132
0x00007f9085943df4    _ZN7Monitor5IWaitEP6Threadl + 0x1d4
0x00007f908594526a    _ZN7Monitor4waitEblb + 0x22a
0x00007f9085b4f892    _ZN8VMThread4loopEv + 0x1d2
0x00007f9085b4fde8    _ZN8VMThread3runEv + 0x78
0x00007f9085985c92    _ZL10java_startP6Thread + 0x102

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
JVM系列(六)、可视化工具介绍 JVM系列(六)、可视化工具介绍
1. Jconsole1.1 Jconsole 介绍Jconsole(Java Monitoring and Management Console)是从java5开始,是一种基于JMX(java management extensions)
2020-01-31
下一篇 
JVM系列(五)、常用命令(上) JVM系列(五)、常用命令(上)
一、介绍运用Jvm自带的命令可以方便的和监控和打印堆栈的日志信息帮忙我们来定位问题。虽然Jvm调用成熟的工具已经很多:jconsole、大名鼎鼎的VisualVM、IMBM的Memory Analyzer 等等。但是在生产环境出现问题的时候
2020-01-29
  目录