前言:
给一个系统定位 问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
数据包括:运行的日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hpror文件)
–引用自 深入理解JAVA虚拟机 一书
常用的jdk自带的工具
注: pid: 为java程序运行的进行号
jps 虚拟机进程状况工具
英文命名JVM Process Status Tools, 显示指定系统内所有的HostSpot虚拟机进程的工具
jps 显示java程序进程号、名称
jps -l 输出运行进程的全类名
jps -v 输出运行进行的启动时的jvm配置参数
jstat 虚拟机统计信息监视工具
英文命名 JVM Statistics Monitoring Tool 用于收集HotSpot虚拟机各方面的运行数据
jstat [option vmid [interval] [s|ms] [count] ]
option:
-class 显示ClassLoad的相关信息;
-compiler 显示JIT编译的相关信息;
-gc 显示和gc相关的堆信息;
-gccapacity 显示各个代的容量以及使用情况;
-gcmetacapacity 显示metaspace的大小
-gcnew 显示新生代信息;
-gcnewcapacity 显示新生代大小和使用情况;
-gcold 显示老年代和永久代的信息;
-gcoldcapacity 显示老年代的大小;
-gcutil 显示垃圾收集信息;
-gccause 显示垃圾回收的相关信息(通-gcutil),
同时显示最后一次或当前正在发生的垃圾回收的诱因;
-printcompilation 输出JIT编译的方法信息;
常用的一些组合如下:
监视java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量已用空间、GC时间合计等信息,以下这条的命令的意思是指定的jvm进程每250ms查询一次进程pid的垃圾收集情况,一共查询 20次
jstat -gc pid 250 20
other:
jstat -gcutil pid
jstat -gccause pid 100
这是一个真实线上的频繁FGC的切片截图
对比上图字段 解释
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
MC:metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
CCSC: 当前压缩类空间大小
CCSU: 压缩类空间使用大小
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
others
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
jstack java 堆栈跟踪工具
该命令主要用于生成虚拟机当前时刻的线程快照(threaddump/javacore文件),即当前虚拟机内每一条线程正在执行的方法的堆栈集合
目的
定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等;
以下命令用于打印除了堆栈外,显示相关锁的附加信息
jstack -l pid > jstack.log
格式如下
jmap 内存映像工具
该命令用于生成堆转存快照(heapdump/hpror文件)
生成dump文件:(注意 会触发一次full gc)
jmap -dump:live,format=b,file=heap.hprof pid
dump分析工具
推荐:Eclipse Memory Analyzer
下载地址:https://www.eclipse.org/mat/downloads.php
加载hprof文件后:
由此基本可分析出些应用存在的问题,jdbc connection创建过多,且未回收到线程池
相关jdk自带的工具
如:
jconsole.exe
jvisualvm.exe
——————-完————————–
L (木秀林 林平行 行由心)
有道无术,术可成;有术无道,止于术
0 条评论