1. Jstack
jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示。
注:这个和thread dump是同样的结果。但是thread dump是用kill -3 pid命令,还是服务器上面少用kill为妙。
1.1 命名行格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
最常用的还是jstack pid
1.2 在thread dump中,要留意下面几种状态
- 死锁,Deadlock(重点关注)
- 等待资源,Waiting on condition(重点关注)
- 等待获取监视器,Waiting on monitor entry(重点关注)
- 阻塞,Blocked(重点关注)
- 执行中,Runnable
- 暂停,Suspended
- 对象等待中,Object.wait() 或 TIMED_WAITING
- 停止,Parked
2. Jmap
得到运行java程序的内存分配的详细情况。例如实例个数,大小等。
2.1 命令行格式
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help 打印辅助信息
-J 传递参数给jmap启动的jvm.
2.2 示例
jmap -histo pid(查看实例)
$ jmap -histo 55126
num #instances #bytes class name
----------------------------------------------
1: 2696 18147408 [B
2: 72107 7164800 [C
3: 1617 2149968 [I
4: 71071 1705704 java.lang.String
5: 30460 1329160 [Ljava.lang.Object;
6: 24424 781568 java.util.HashMap$Node
7: 12488 599424 gnu.trove.THashMap
8: 3781 420352 java.lang.Class
9: 12456 298944 org.jetbrains.jps.model.ex.JpsElementContainerImpl
10: 8854 283328 java.util.concurrent.ConcurrentHashMap$Node
11: 740 183472 [Ljava.util.HashMap$Node;
12: 4954 158528 org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl
13: 2866 137568 java.util.HashMap
14: 7992 127872 java.lang.Object
15: 3967 126944 java.io.File
16: 4048 97152 org.jetbrains.jps.model.java.impl.JpsJavaDependencyExtensionImpl
17: 3716 89184 org.jetbrains.jps.model.module.impl.JpsLibraryDependencyImpl
18: 5426 86816 org.jetbrains.jps.model.impl.JpsProjectElementReference
19: 959 84392 java.lang.reflect.Method
20: 3359 80616 com.intellij.util.SmartList
21: 56 72288 [Ljava.util.concurrent.ConcurrentHashMap$Node;
22: 1772 70880 java.lang.ref.Finalizer
23: 1967 62944 org.jetbrains.jps.model.impl.JpsElementCollectionImpl
24: 2549 61176 java.util.ArrayList
25: 1250 50000 org.jetbrains.jps.incremental.artifacts.instructions.FileBasedArtifactRootDescriptor
26: 631 45432 java.lang.reflect.Field
27: 1404 44928 org.jetbrains.jps.model.library.impl.JpsLibraryRootImpl
jmap -dump:format=b,file=heap.bin pid(导出内存,据说对性能有影响,小心使用)
format=b是通过二进制的意思
3. Jstat
这是一个比较实用的一个命令,可以观察到classloader,compiler,gc相关信息。可以时时监控资源和性能。
3.1 命令格式
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
3.2 输出参数内容
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S0C:S0当前容量的大小
S0U:S0已经使用的大小
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
S1C:S1当前容量的大小
S1U:S1已经使用的大小
E — Heap上的 Eden space 区已使用空间的百分比
EC:Eden space当前容量的大小
EU:Eden space已经使用的大小
O — Heap上的 Old space 区已使用空间的百分比
OC:Old space当前容量的大小
OU:Old space已经使用的大小
P — Perm space 区已使用空间的百分比
OC:Perm space当前容量的大小
OU:Perm space已经使用的大小
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC
3.3 示例
jstat -gc pid
$ jstat -gc 55126
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
10752.0 10752.0 0.0 0.0 65536.0 18435.3 122880.0 15341.9 21248.0 20582.4 2560.0 2299.6 3 0.038 1 0.061 0.099
jstat -gcutil pid
$ jstat -gcutil 55126
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 28.13 12.49 96.87 89.83 3 0.038 1 0.061 0.099
jstat -gc pid 100 5
$ jstat -gcutil 55126 100 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 28.13 12.49 96.87 89.83 3 0.038 1 0.061 0.099
0.00 0.00 28.13 12.49 96.87 89.83 3 0.038 1 0.061 0.099
0.00 0.00 28.13 12.49 96.87 89.83 3 0.038 1 0.061 0.099
0.00 0.00 28.13 12.49 96.87 89.83 3 0.038 1 0.061 0.099
0.00 0.00 28.13 12.49 96.87 89.83 3 0.038 1 0.061 0.099
jstat -gccapacity pid
$ jstat -gccapacity 55126
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
87040.0 238592.0 87040.0 10752.0 10752.0 65536.0 175104.0 478208.0 122880.0 122880.0 0.0 1069056.0 21248.0 0.0 1048576.0 2560.0 3 1
参考
三个实例演示 Java Thread Dump 日志分析
jstack(查看线程)、jmap(查看内存)和jstat(性能分析)