注以下命令 后面加个毫秒数可以每多少毫秒采集一次
类加载统计
root@iZ2ze2u21foywir3wp68o6Z dubbo_service]# jstat -class 10755 Loaded(加载class的数量kb) Bytes(所占用空间大小kb) Unloaded(未加载数量kb) Bytes(未加载占用空间kb) Time(时间) 15780 30092.6 210 282.2 8.39
编译统计
[root@iZ2ze2u21foywir3wp68o6Z dubbo_service]# jstat -compiler 10755
Compiled(编译数量) Failed(失败数量) Invalid(不可用数量) Time (时间) FailedType(失败类型) FailedMethod(失败方法)
20007 3 0 98.91 1 com/mysql/jdbc/AbandonedConnectionCleanupThread run
gc统计
jstat -gc 10755 1000 #1秒采集一次
jstat -gc 1075
S0C:年轻代中 To Survivor 的容量(单位 KB);
S1C:年轻代中 From Survivor 的容量(单位 KB);
S0U:年轻代中 To Survivor 目前已使用空间(单位 KB);
S1U:年轻代中 From Survivor 目前已使用空间(单位 KB);
EC:年轻代中 Eden 的容量(单位 KB);
EU:年轻代中 Eden 目前已使用空间(单位 KB);
OC:Old 代的容量(单位 KB);
OU:Old 代目前已使用空间(单位 KB);
MC:Metaspace 的容量(单位 KB);
MU:Metaspace 目前已使用空间(单位 KB);
YGC:从应用程序启动到采样时年轻代中 gc 次数;
YGCT:从应用程序启动到采样时年轻代中 gc 所用时间 (s);
FGC:从应用程序启动到采样时 old 代(全 gc)gc 次数;
FGCT:从应用程序启动到采样时 old 代(全 gc)gc 所用时间 (s);
GCT:从应用程序启动到采样时 gc 用的总时间 (s)。
堆内分配统计
jstat -gccapacity 10755
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
新生代gc和内存情况统计
jstat -gcnew 10755
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
老年代gc和内存情况统计
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
老年代内存统计
jstat -gcoldcapacity 10755
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
jdk1.7永久代统计
jstat -gcpermcapacity 19570
PGCMN:最小永久代容量
PGCMX:最大永久代容量
PGC:当前新生成的永久代空间大小
PC :永久代空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
JDK8 下 元数据空间统计
jstat -gcmetacapacity 10755
MCMN:最小元数据容量 MCMX:最大元数据容量 MC:当前元数据空间大小 CCSMN:最小压缩类空间大小 CCSMX:最大压缩类空间大小 CCSC:当前压缩类空间大小 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
内存使用百分比
jstat -gcutil 10755
S0:幸存1区当前使用比例 S1:幸存2区当前使用比例 E:伊甸园区使用比例 O:老年代使用比例 M:元数据区使用比例 CCS:压缩使用比例 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
jstack
统计线程数量
./jstack -l 5014 | grep 'java.lang.Thread.State' | wc -l
各个线程状态
./jstack 5014 | grep "java.lang.Thread.State" | sort -nr | uniq -c
高CPU占用排查
用来dump线程的堆栈信息 排查死锁和高cpu代码定位
jstack 19751|grep -A20 5295 //查找5295 并打印后20行 jstack 19751|grep -A20 5295 >/root/threaddump.txt//查找5295 并打印后20行 并输出到指定文件 jstack 19751 >/root/threaddump.txt// dump整个线程堆栈并输出到指定文件
JMAP
查看jvm配置以及内存信息
1.通过ps -ef找到PID
ps -ef|grep "程序名字"
2.通过jmap打印jvm信息
jmap -heap PID
如果出现: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.191-b12. Target VM is 错误可能是系统装了多jdk,定位到当前jdk 指定使用binn下面的jmap
[root@kuaihe-test3 bin]# ./jmap -heap 19751 Attaching to process ID 19751, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.181-b13 #垃圾回收器信息 using thread-local object allocation. # 指的是本地线程分配缓冲(TLAB,Thread Local Allocation Buffer)。并不是栈上分配(Stack Allocation,HotSpot暂时没有做这项优化)。 Parallel GC with 8 thread(s) #并行 8个gc线程 Heap Configuration: MinHeapFreeRatio = 0 #最小堆使用比例 MaxHeapFreeRatio = 100 #最大堆使用比例 MaxHeapSize = 4164943872 (3972.0MB) #最大堆空间大小 NewSize = 87031808 (83.0MB) #新生代分配大小 MaxNewSize = 1388314624 (1324.0MB) #最大新生代可分配大小 OldSize = 175112192 (167.0MB) #老年代大小 NewRatio = 2 #新生代老年代比例 SurvivorRatio = 8 # MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 742391808 (708.0MB) used = 9056640 (8.6370849609375MB) free = 733335168 (699.3629150390625MB) 1.2199272543697033% used From Space: capacity = 2097152 (2.0MB) used = 0 (0.0MB) free = 2097152 (2.0MB) 0.0% used To Space: capacity = 13631488 (13.0MB) used = 0 (0.0MB) free = 13631488 (13.0MB) 0.0% used PS Old Generation capacity = 2776629248 (2648.0MB) used = 2699893784 (2574.8193588256836MB) free = 76735464 (73.1806411743164MB) 97.23638062030527% used
配置解读
1: MinHeapFreeRatio=<n> 指定 jvm heap 在使用率小于 n 的情况下 ,heap 进行收缩 ,Xmx==Xms 的情况下无效 , 如 :-XX:MinHeapFreeRatio=30 2: MaxHeapFreeRatio=<n> 指定 jvm heap 在使用率大于 n 的情况下 ,heap 进行扩张 ,Xmx==Xms 的情况下无效 , 如 :-XX:MaxHeapFreeRatio=70 3:MaxHeapSize=<n> 最大堆内存(绝对值) 如:-Xmx100m 4:NewSize=<n> 设置年轻代大小(绝对值) 如-XX:NewSize=100m e:MaxNewSize=<n> 年轻代最大内存(绝对值),如:-XX:MaxNewSize=100m 5:OldSize=<n> 设置JVM启动分配的老年代内存大小 如:-XX:OldSize=60M 6:NewRatio=<n> 年轻代与老年代的比例 如-XX:NewRatio=2 则 为1:2 7:SurvivorRatio=<n> 轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个如:-XX:SurvivorRatio=8 则eden区和2个Survivor 是8:1:1 8:MetaspaceSize=<n> 元空间大小元空间大小,元空间本质跟永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存。因此,元空间大小仅受本地内存限制。 如:-XX:MetaspaceSize=512m 9:CompressedClassSpaceSize=<n> 作用:https://www.zhihu.com/question/268392125 10:MaxMetaspaceSize=<n> 元空间的最大值 每次扩容会需要产生fullgc 下面分别为 年轻代 eden区 form to区,老年代的内存大小、使用内存 、可用内存。