Linux下的性能监控工具(to be continued)
显示系统整体资源使用情况——top命令,top的前半部分是系统统计信息,后半部分是进程信息。
在统计信息中,第一行是任务队列信息,它的结果等同于uptime命令。从左到右依次表示:系统当前时间,系统运行时间,当前登陆用户数。最后的load average表示系统的平均负载,分别是1、5、15分钟的平均值.
第二行是进程统计信息,分别有正在运行的进程数、睡眠进程数、停止进程数、僵尸进程数。
第三行是cpu统计信息,us表示用户空间cpu占有率,sy表示内核空间cpu占有率,ni表示用户进程空间改变过优先级的进程cpu的占有率,id表示空闲cpu占有率,wa表示等待输入输出的cpu时间百分比,hi表示硬件终端请求,si表示软件终端请求。
在Mem行中,从左到右,依次表示物理内存总量、已使用的物理内存、空闲无力内存、内核缓冲使用量。Swap行依次表示交换去总量、空闲交换区大小、缓冲交换区大小。
外科手术刀:JDK性能监控工具
1.查看Java进程-jps命令
jps -q 可以列出Java的进程
jps -m 可以用于输出产地给Java进程的参数
jps -l 用于输出主函数的完整路径
jps -v 可以显示传递给java虚拟机的参数
2.查看虚拟机运行时的信息-jstat命令
jstat是一个可以用于观察java应用程序运行时相关信息的工具。它的功能相当强大,可以通过它查看堆信息的详细情况。它的基本语法为jstat -<option> [-t] [-h<lines>] <vmid> [<interval [<count>]
*选项option可以由以下值构成:
-class:显示ClassLoader的相关信息
-compiler:显示JIT编译的相关信息
-gc:显示与GC相关的堆信息
-gccapacity:显示各个代的容量及使用情况
-gccause:显示垃圾收集相关信息,同时显示最后一次当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代的信息
-gcnewcapacity:显示新生代大小的使用情况
-gcold:显示老年代和永久代的信息
-gcoldcapacity:显示老年代的大小
-gcpermcapacity:显示永久代的大小
-gcutil:显示垃圾收集信息
-printcomplilation:输出JIT编译的方法信息
*-t可以在输出信息前加上一个timestamp列,显示程序的运行时间
*-h参数可以在周期性数据输出时,输出多少行数据后,跟着输出一个表头信息
*interval参数用于指定输出统计数据的周期,单位为毫秒。
*count用于指定一共输出多少数据。
例:
jstat -class -t 2927 1000 2 ,输出进程2972的ClassLoader相关信息。每秒钟统计一次信息,一共输出两次。
在-class的输出中,Loader表示载入类的数量,Bytes表示再如雷的合计大小,Unloader表示卸载类的数量,第二个Bytes表示卸载类的大小,Time表示在加载和卸载类上所花的时间(图6-1)。
例:
jstat -compliler -t 2972 ,Compiled表示编译任务执行的次数,Failed表示编译失败的次数,Invalid表示编译不可用的次数,Time表示编译的总耗时,FailedType表示最后一次编译失败的类型,FailedMethod表示最后一次编译失败的类名和方法名(图6-2)。
例:
jstat -gc pid ,显示gc相关堆的信息(图6-3)
S0C:年轻代中第一个survivor的容量(kb)
S1C:年轻代中第二个survivor的容量(kb)
SOU:年轻代中第一个survivor的已使用容量(kb)
S1C:年轻代中第二个survivor的已使用容量(kb)
EC:eden区的大小(KB)
EU:eden区的使用空间(KB)
OC:老年代大小(KB)
OU:老年代已经使用的空间(KB)
PC:永久区的大小(KB)
PU:永久区已经使用的空间(KB)
YGC:新生代GC次数
YGCT:新生代GC耗时
FGC:Full GC次数(s)
FGCT:Full GC耗时(s)
GCT:GC总耗时(s)
例:(图6-4)
jstat -gccapacoty pid 显示gc各区域的容量大小
NGCMN:新生代最小值(KB)
NGCMX:新生代最大值
NGC:当前新声代最小值
OGCMN:老年代最小值
OGCMX:老年代最大值
PGCMN:永久代最小值
PGCMX:永久带最大值
例:(图6-5)
jstat -gccause pid ,显示最近一次GC的原因
LGCC:上次GC的原因
GCC:上次GC的原因
例:(图6-6)
jstat -gcnew参数可以用于查看新生代的一些详细信息
TT:新生代对象晋升到老年代对象的年龄
MTT:新生代对象晋升到老年代对象的最大年龄
DSS:所需的sirvivor区大小
例:-gcnewcapacity参数可以详细输出新生代各个区的大小信息
-gcold用来展现老年代gc的情况
-gcoldcapacity用来展现老年代的容量信息
-gpermcapacity用来展示永久区的使用情况
-gcutil用于展示gc相关回收信息
S0:s0区使用的百分比
S1:s1区使用的百分比
E:eden区使用的百分比
O:old区使用的百分比
P:永久区使用的百分比
总结:jstat命令可以非常详细地查看java应用程序的堆使用情况以及gc情况
3.查看虚拟机参数--jinfo命令
jinfo可以用来查看正在运行的java应用程序的扩展参数,甚至支持在运行时,修改部分参数。它的基本语法是jinfo <option> <pid>。
在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能非常艰难。但有了jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。
比如,下例显示了新生代对象晋升到老年代对象的最大年龄,通过jinfo,可以查看这个参数的当前数值。
* -flag<name>:打印指定Java虚拟机的参数值.
* -flag[+|-]<name>:设置指定Java虚拟机参数的布尔值
* -flag<name>=<value>:设置指定Java虚拟机参数的值
例:jinfo -flag MaxTenuringThreshold pid -XX:MaxTenuringThreshold=15
是否打印GC详细信息:
jinfo -flag PrintGCDetails pid -XX:PrintGCDetails
除了查找参数的值,jinfo也支持修改部分参数的值,当然,这个修改能力很有限。下例显示了通过jinfo对PrintGCDetails参数的修改,它可以在Java程序运行时,动态关闭或打开这个开关。(图6-8)
4.导出堆到文件--jmap命令
jmap可以生成堆dump文件,也可以查看堆内对象实例的统计信息、查看classLoader信息等
例:生成pid为2972的对象统计信息,并输出到指定文件
jmap -histo 2972 > *.txt
另外一个重要的功能就是得到Java程序的当前堆快照
例:jmap -dump format=b,file=/usr/local/heap.hprof pid
生成的dump文件可以用VisualVM、MAT等工具查看
通过jmap -permstat pid查看系统的ClassLoader信息
通过jmap -finalizerinfo pid查看finalizer队列中的对象
5.jdk自带的堆分析工具--jhat命令
jhat dump.file,直接访问默认http://localhost:7000查看结果
6.查看线程堆栈--jstack命令
jstack可以用于导出Java应用程序的线程堆栈,语法为:
jstack [-l] <pid>,-l选项用于打印锁的附加信息
jstack,不仅可以得到线程堆栈,它还能自动进行死锁检测,输出死锁的信息
7.远程主机信息收集--jstatd命令
jps、jstat支持远程监控,需要配合使用jstatd工具。它的作用相当于代理服务器,建立本地计算机与远程监控的通信。
8.多功能命令行--jcmd命令
jcmd是一个多功能工具,可以用来导出堆、查看Java进程、导出线程信息、执行gc等。
命令jcmd可以针对给定的Java当前系统中所有的虚拟机,参数-l列出所有虚拟机,针对每一个虚拟机可以使用help命令可以列出所支持的命令.
jcmd pid help:
1.如jcmd pid VM.uptime可以查看虚拟机启动时间
2.jcmd pid Thread.print打印线程栈信息
3.jcmd pid GC.heap_dump path导出堆信息
4.jcmd pid VM.system_properties获取系统的Properties信息
5.jcmd pid PerfCounter.print获取性能统计的信息
jcmd拥有jmap的大部分功能,oracle也推崇jcmd替换jmap
9.性能统计工具-hprof
hprof不是独立的监控工具,它只是一个Javaagent工具。它可以用于监控Java应用程序在运行时的cpu信息和堆信息。使用java -agentlib:hprof=help命令可以查看它的帮助文档