一、Jstat使用详解
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。参考格式如下:jstat -options pid interval (pid:应用id,interval:时间间隔。这两项可以选填 )
可以列出当前JVM版本支持的选项,常见的options有:
l class (类加载器)
l compiler (JIT)
l gc (GC堆状态)
l gccapacity (各区大小)
l gccause (最近一次GC统计和原因)
l gcnew (新区统计)
l gcnewcapacity (新区大小)
l gcold (老区统计)
l gcoldcapacity (老区大小)
l gcpermcapacity (永久区大小)
l gcutil (GC统计汇总)
l printcompilation (HotSpot编译统计)
1、jstat –class<pid> : 显示加载class的数量,及所占空间等信息。
Loaded:装载的类的数量
Bytes:装载类所占用的字节数
Unloaded:卸载类的数量
Bytes:卸载类的字节数
Time:装载和卸载类所花费的时间
2、jstat -compiler <pid>显示VM实时编译的数量等信息。
Compiled:编译任务执行数量
Failed:编译任务执行失败数量
Invalid:编译任务执行失效数量
Time:编译任务消耗时间
FailedType:最后一个编译失败任务的类型
FailedMethod:最后一个编译失败任务所在的类及方法
3、jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC :Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
MC:metaspace元数据空间的容量 (字节)
MU:metaspace元数据空间目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
4、jstat -gccapacity <pid>:可以显示,VM内存中(young,old,metaspace)对象的使用和占用大小
NGCMN:年轻代(young)中初始化(最小)的大小(字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX :old代的最大容量(字节)
OGC:old代当前新生成的容量 (字节)
OC:Old代当前容量 (字节)
MCMN:元数据区初始化(最小)时的容量 (字节)
MCMX:元数据区的最大容量 (字节)
MC:元数据区当前占用的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
CCSMN:压缩类最小内存区
CCSMX:压缩类最大内存区
CCSC:压缩类当前占用内存大小
5、jstat -gcutil <pid>:统计gc信息
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
M:元数据区已使用的占当前容量百分比
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
6、jstat -gcnew <pid>:年轻代对象的信息:
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
TT:持有次数限制
MTT:最大持有次数限制
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
7、jstat -gcnewcapacity<pid>: 年轻代对象的信息及其占用量:
NGCMN:年轻代(young)中初始化(最小)的大小(字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1CMX:年轻代中第二个survivor(幸存区)的最大容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
8、jstat -gcold <pid>:old代对象的信息:
MC:元数据区的容量 (字节)
MU:元数据区目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
9、stat -gcoldcapacity <pid>: old代对象的信息及其占用量:
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量(字节)
OGC:old代当前新生成的容量 (字节)
OC:Old代的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
10、jstat -gcmetacapacity<pid>: 元数据对象的信息及其占用量:
MCMN:元数据区初始化(最小)的大小 (字节)
MCMX:元数据区的最大容量 (字节)
MC:元数据区当前新生成的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
CCSMN:压缩类最小内存区
CCSMX:压缩类最大内存区
CCSC:压缩类当前占用内存大小
11、jstat -printcompilation <pid>:当前VM执行的信息:
Compiled:编译任务的数目
Size:方法生成的字节码的大小
Type:编译类型
Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
二、Arthas使用
1、下载安装
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
2、安装启动完成后,Arthas会自动检测java程序,这时候,你选择一下就可以了:
3、启动完成后,输入命令就可以监控Java程序了
4、常用命令:
- dashboard
dashboard
USAGE:
dashboard [-b] [-i <value>] [-n <value>]
SUMMARY:
Overview of target jvm's thread, memory, gc, vm, tomcat info.
EXAMPLES:
dashboard
dashboard -n 10
dashboard -i 2000
WIKI:
https://alibaba.github.io/arthas/dashboard
OPTIONS:
-b, --batch Execute this command in batch mode.
-i, --interval <value> The interval (in ms) between two executions, default is 5000 ms.
(每次执行间隔时间)
-n, --number-of-execution <value> The number of times this command will be executed.
(执行多少次dashboard,不指定的话会一直刷新)
- thread:查看当前JVM中的线程信息
$ thread
USAGE:
thread [-b] [-i <value>] [-n <value>] [id]
SUMMARY:
Display thread info, thread stack
EXAMPLES:
thread
thread 51
thread -n -1
thread -n 5
thread -b
thread -i 2000
WIKI:
https://alibaba.github.io/arthas/thread
OPTIONS:
-b, --include-blocking-thread Find the thread who is holding a lock that blocks the most number of threads.
(查看目前block的线程)
-i, --sample-interval <value> Specify the sampling interval (in ms) when calculating cpu usage.
(查看在接下来的多长时间内的cpu利用率)
-n, --top-n-threads <value> The number of thread(s) to show, ordered by cpu utilization, -1 to show all.
( 查看cpu占用率前n的线程的堆栈信息)
<id> Show thread stack(直接跟着线程id,可以看到thread的堆栈信息)
- 基础命令
help——查看命令帮助信息
cat——打印文件内容,和linux里的cat命令类似
pwd——返回当前的工作目录,和linux命令类似
cls——清空当前屏幕区域
session——查看当前会话的信息
reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version——输出当前目标 Java 进程所加载的 Arthas 版本号
history——打印命令历史
quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap——Arthas快捷键列表及自定义快捷键
在此介绍dashboard、thread这两个经常使用的命令,其他指令可以根据需求自行查找,可以查看官方文档或者百度自行搜索,在此就不一一介绍了!
官方文档:https://alibaba.github.io/arthas