jvm 性能监控命令
*************************
jps:查看当前运行的java应用称序
命令格式:jps [options] [hostId]
-q:不输出主类名称
-m:传递给java main方法的参数
-l:输出类的全限定名,默认只输出类的名称
-v:输出java应用程序的jvm参数
hostId:主机的名称(如localhost),缺省则默认为当前主机
示例:jps -l
1424 org.jetbrains.idea.maven.server.RemoteMavenServer36
2320 jdk.jcmd/sun.tools.jps.Jps
14056 org.jetbrains.jps.cmdline.Launcher
8008
3836 com.example.demo.jvm.Test
*************************
jstat:jvm 统计信息(类加载、内存、gc等)
命令格式:jstat option pid [interval(s|ms)] [count]
命令说明:间隔interval查询相关信息,共查询count次,缺省则表示只查询一次
-class:类加载、卸载、总空间、加载时间
-gc:监视java堆,新生代、老年代、gc时间等
-gccapacity:输出java堆各区域使用的最大最小空间
-gcutil:输出已使用空间占总空间的百分比
-gccause:输出上次gc原因
-gcnew:输出新生代gc信息
-gccapacity:输出新生代使用的最大最小空间
-gcold:输出老年代gc信息
-gccapacity:输出老年代使用的最大最小空间
-compiler:输出jit编译的方法数量、耗时
-printcpmpilation:输出jit编译的方法
*******************
示例
jstat -class 8008
Loaded Bytes Unloaded Bytes Time
61975 129886.3 1231 1393.0 177.89
jstat -gc 8008
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC
CGCT GCT
4352.0 4352.0 0.0 1001.8 34944.0 8883.4 370500.0 327184.9 384208.0 367418.8 52744.0 46797.9 263 1.987 0 0.000 1
6 1.194 3.181
jstat -class 8008 2s 2
Loaded Bytes Unloaded Bytes Time
61975 129886.3 1231 1393.0 177.89
61975 129886.3 1231 1393.0 177.89
jstat -compiler 8008
Compiled Failed Invalid Time FailedType FailedMethod
51427 14 0 239.94 1 com/intellij/psi/util/PsiTreeUtilKt walkUpToCommonParent
jstat -printcompilation 8008
Compiled Size Type Method
51440 16 1 kotlin/SynchronizedLazyImpl isInitialized
*************************
jinfo:查看、修改虚拟机参数
命令格式:jinfo option pid
-flag name:查看虚拟机参数name
-flag -name:禁用虚拟机参数name
-flag +name:开启虚拟机参数name
-flag name=value:设置虚拟机参数name的值为value
*******************
示例
jinfo -flag UseSerialGC 8008:查看是否使用serial +serial old 组合
-XX:-UseSerialGC //没有使用 serial + serial old垃圾回收组合
jinfo -flag UseG1 14380:查看是否使用g1垃圾收集器
-XX:+UseG1GC //使用g1垃圾回收器进行回收
jinfo -flag InitialHeapSize 4084:查看初始堆大小
-XX:InitialHeapSize=134217728
*************************
jmap:生成堆转储快照
命令格式:jmap option pid
Usage:
jmap -clstats <pid>
to connect to running process and print class loader statistics
jmap -finalizerinfo <pid>
to connect to running process and print information on objects awaiting finalization
jmap -histo[:[<histo-options>]] <pid>
to connect to running process and print histogram of java object heap
jmap -dump:<dump-options> <pid>
to connect to running process and dump java heap
jmap -? -h --help
to print this help message
-clstats:类加载信息
-finalizerinfo:显示等待执行finalize、进行销毁的对象
-histo:堆中对象统计信息,实例数、类信息、占用空间
-dump:生成堆转储快照,如:-dump:live,format=b,file=filename(输出存活对象、二进制格式、名称filename)
dump-options
dump-options:
live dump only live objects
all dump all objects in the heap (default if one of "live" or "all" is not specified
format=b binary format
file=<file> dump heap to <file>
histo-options
histo-options:
live count only live objects
all count all objects in the heap (default if one of "live" or "all" is not specified)
file=<file> dump data to <file>
*******************
示例
jmap -clstats 16904
Index Super InstBytes KlassBytes annotations CpAll MethodCount Bytecodes MethodAll ROAll RWAll Total ClassName
1 -1 1830632 520 0 0 0 0 0 24 632 656 [B
2 -1 184408 520 0 0 0 0 0 24 632 656 [I
3 41 181200 688 136 17096 123 5428 45608 23792 41720 65512 java.lang.String
4 -1 159448 520 0 0 0 0 0 24 632 656 [C
5 41 139272 792 0 23928 152 5927 40320 29672 38088 67760 java.lang.Class
6 41 120768 608 0 1384 7 149 1888 1200 3032 4232 java.util.HashMap$Node
7 -1 107184 520 0 0 0 0 0 24 632 656 [Ljava.lang.Object;
8 -1 58960 520 0 0 0 0 0 32 632 664 [Ljava.util.HashMap$Node;
9 6 50120 608 0 504 1 10 632 312 1672 1984 java.util.LinkedHashMap$En
try
jmap -histo 16904(部分输出)
No dump file specified
num #instances #bytes class name (module)
-------------------------------------------------------
1: 12286 2468920 [B (java.base@14.0.1)
2: 1195 636080 [I (java.base@14.0.1)
3: 9867 315744 java.util.HashMap$Node (java.base@14.0.1)
4: 463 304392 [C (java.base@14.0.1)
5: 9171 220104 java.lang.String (java.base@14.0.1)
6: 957 178504 [Ljava.util.HashMap$Node; (java.base@14.0.1)
7: 2966 161512 [Ljava.lang.Object; (java.base@14.0.1)
8: 1140 139272 java.lang.Class (java.base@14.0.1)
9: 6840 109440 java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry (java.base@14.0.1)
jmap -histo:file=histo 16904:输出到指定文件
Heap inspection file created: E:\java\IdeaProjects\springboot fastjson\histo
jmap -dump:live,format=b,file=dump 16904:内存快照信息输出到指定文件
Dumping heap to E:\java\IdeaProjects\springboot fastjson\dump ...
Heap dump file created [5805111 bytes in 0.025 secs]
*************************
jastck:生成线程快照(主要分析线程长时间停顿原因、cpu异常)
命令格式:jstack [option] pid
Usage:
jstack [-l][-e] <pid>
(to connect to running process)
Options:
-l long listing. Prints additional information about locks
-e extended listing. Prints additional information about threads
-? -h --help -help to print this help message
-l:输出锁信息
-e:输出线程信息
*******************
示例
jstack 4908
2020-07-20 17:18:37
Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):
Threads class SMR info:
_java_thread_list=0x000002344283b1c0, length=12, elements={
0x0000023422b67800, 0x0000023441bae000, 0x0000023441baf000, 0x0000023441bce000,
0x0000023441bd1000, 0x0000023441bd2800, 0x0000023441bda800, 0x0000023442458800,
0x0000023441beb800, 0x0000023441b93000, 0x000002344274f800, 0x000002344282f000
}
"main" #1 prio=5 os_prio=0 cpu=67000.00ms elapsed=67.02s tid=0x0000023422b67800 nid=0x19ec runnable [0x000000b3aa1fe000]
java.lang.Thread.State: RUNNABLE
at com.example.demo.jvm.Test.main(Test.java:21)
"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=67.00s tid=0x0000023441bae000 nid=0x3f88 waiting on condition [0x00
0000b3aa8ff000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@14.0.1/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@14.0.1/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@14.0.1/Reference.java:213)
"Finalizer" #3 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=67.00s tid=0x0000023441baf000 nid=0x294c in Object.wait() [0x000000b3aa9ff00
0]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@14.0.1/Native Method)
- waiting on <0x0000000089b0b1b8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14.0.1/ReferenceQueue.java:155)
- locked <0x0000000089b0b1b8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@14.0.1/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@14.0.1/Finalizer.java:170)
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=66.98s tid=0x0000023441bce000 nid=0x472c runnable [0x000000000000000
0]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #5 daemon prio=5 os_prio=2 cpu=31.25ms elapsed=66.98s tid=0x0000023441bd1000 nid=0x20bc waiting on condition [0x0000
000000000000]
java.lang.Thread.State: RUNNABLE
"Service Thread" #6 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=66.98s tid=0x0000023441bd2800 nid=0x3f60 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
daemon:线程后台运行
prio:线程优先级
os_prio:线程操作系统优先级
cpu:占用cpu时间
elapsed:实际运行时间
tid:线程在内存中地址
nid:线程在系统中的id
java.lang.Thread.State:线程运行状态(new、Runnable、blocked、waiting、timed_waiting、terminated)
public class Thread implements Runnable {
**********
内部枚举:Thread.State
public enum State {
NEW, //线程创建,还没有调用start方法
RUNNABLE, //调用start方法,正在运行或者等待运行
BLOCKED, //线程等待获取锁(线程死锁)
WAITING, //线程等待
TIMED_WAITING, //限时等待
TERMINATED; //线程正常执行完毕、异常退出
}