为什么使用jdk命令工具
当系统需要定位问题的时候,这需要我们使用适当的虚拟机监控和分析工具来帮助我们快速定位问题。
jps工具:虚拟机进程状况工具
- 作用:列出正在运行的虚拟机进程,并显示虚拟机执行的主类的名称以及进程的本地虚拟机的唯一ID。
- jps命令的格式
jps 【option】【hostid】
hostid指定了目标的服务器,它的语法如下:
[protocol:][[//]hostname][:port][/servername]
protocol - 如果protocol及hostname都没有指定,那表示的是与当前环境相关的本地协议,
如果指定了hostname却没有指定protocol,那么protocol的默认就是rmi。
hostname - 服务器的IP或者名称,没有指定则表示本机。
port - 远程rmi的端口,如果没有指定则默认为1099。
Servername - 注册到RMI注册中心中的jstatd的名称。
-
jps工具参数
- 例子
public class ZkTest {
public static void main(String[] args) throws Exception {
Thread.sleep(30000);
System.out.println("haha");
}
}
说明:执行ZkTest的这个类的main方法的虚拟机进程ID为5884。
jstat工具:查看虚拟机运行信息
- 作用:监视虚拟机各种运行状态信息。可以监视本地以及远程的类装载、内存、垃圾收集、JIT编译等运行数据。如果我们没有使用可视化工具来定位虚拟机性能和故障,可以使用jstat工具。
- jstat命令的格式
jstat [ option vmid [ interval [ s | ms ] [ count ] ] ]
注意:
如果我们排查的是本地虚拟机进程,VMID和LVMID是一样的。interval表示查询间隔,count表示查询次数。
例子:
如果我们想每200毫秒,一共10次,查看监视类装载、卸载数量、总空间以及类装载所耗费的时间信息。
jstat -class 5884 200 10
-
jstat命令参数
- 例子:
显示类加载的信息
[root@sunpyServer /]# jstat -class 5733
Loaded Bytes Unloaded Bytes Time
7932 14977.5 136 201.6 7.29
说明:
Loaded:加载class的数量为7932 个。
Bytes:加载所占用的空间大小14977.5字节。
Unloaded:未加载class的数量为136个。
Bytes:未加载占用的空间大小201.6字节。
Time:类装载耗费的时间7.29毫秒。
显示垃圾收集信息
[root@sunpyServer /]# jstat -gcutil 5733
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 20.93 57.12 97.06 92.86 244 1.428 43 4.974 6.403
说明:
S0:Survivor区,表示Survivor0占0.00%。
S1:Survivor区,表示Survivor1占0.00%。
E:新生代Eden区(E,表示Eden)使用了20.93%的空间。
O:老年代(O,表示Old)使用了57.12%。
M:元空间(M,表示Metaspace)使用了97.06%。
CCS:压缩使用比例92.86%。
YGC:Young GC 244次。
YGCT:Young GC总共耗时1.428秒。
FGC:Full GC 43次。
FGCT:Full GC共耗时为4.974秒。
GCT:所有GC总耗时6.403秒。
jmap工具:java内存映像工具
- 作用:用于生成堆转储快照、它还可以查询finalize执行队列、java堆和永久代的详细信息(如空间使用率、当前用的哪种收集器)。
- jmap命令的格式
jmap 【option】vmid
-
jmap命令参数
jstack工具:java堆栈跟踪工具
- 作用:生成虚拟机当前时刻的线程快照(threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目得是定位线程出现长时间停顿的原因。譬如:线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
- jstack命令格式:
jstack【option】vmid
-
jstack命令参数:
- 例子
D:\Java\java_123\jdk\bin>jstack 5216
2018-09-09 21:05:26
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):
"Service Thread" daemon prio=6 tid=0x000000000e595800 nid=0xdd4 runnable [0x0000
000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=10 tid=0x000000000e593800 nid=0x6a8 waiting on
condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=10 tid=0x000000000cdce800 nid=0x1ad4 waiting on
condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x000000000cdcd800 nid=0x1b74 waiting on co
ndition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x000000000cdc6800 nid=0xf54 runnable [0x
0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x000000000cd57000 nid=0x7c8 in Object.wait() [0x0
00000000e02f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007c1705568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007c1705568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)
"Reference Handler" daemon prio=10 tid=0x000000000cd4e000 nid=0x1084 in Object.w
ait() [0x000000000de6e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007c17050f0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000007c17050f0> (a java.lang.ref.Reference$Lock)
"main" prio=6 tid=0x000000000212f800 nid=0xf98 waiting on condition [0x000000000
23ff000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at spring_enterprise.ZkTest.main(ZkTest.java:11)
"VM Thread" prio=10 tid=0x000000000cd4a000 nid=0x1728 runnable
"GC task thread#0 (ParallelGC)" prio=6 tid=0x000000000202d800 nid=0x2f0 runnable
"GC task thread#1 (ParallelGC)" prio=6 tid=0x000000000202f800 nid=0x7f0 runnable
"GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002031000 nid=0x18cc runnabl
e
"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002033000 nid=0x1a88 runnabl
e
"VM Periodic Task Thread" prio=10 tid=0x000000000e5b0000 nid=0x1880 waiting on c
ondition
JNI global references: 109
说明:从上面的信息可以看出main中waiting on condition情况,该main方法中调用sleep,线程在进行睡眠,在ZkTest的11行代码,并且调用本地方法java.lang.Thread.sleep。