虚拟机性能监控与故障处理工具
实践的角度了解虚拟机内存管理的世界。
一、jdk的命令行工具
1.JPS(JVM Process Status Tool)虚拟机进程状况工具。
显示制定系统内所有的HotSpot虚拟机进程。
功能单一,但是其他jdk工具大多需要输入它查询到的LVMID来确定要监控的哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID与OS的进程ID是一致的。
使用: jps [options] [hostid]
例子:
2.jstat (JDK Statistic Monitoring Tool) 虚拟机统计信息监控工具
用于监控虚拟机各种运行状态信息的命令行工具。可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行时数据。没有GUI界面。它是运行期定位虚拟机性能问题的首选工具。
jshat 格式:
jshat [option vimd [interval [s|ms] [count] ] ]
vmid :虚拟机唯一ID,如果本地虚拟机进程,vmid与lvmid一致,如果远程虚拟机进程,那么vmid格式应该是:
[protocol :][//] lvmid[@hostname [:port] /servername].
interval和count :查询时隔和次数。如果没有这两个参数只查询一次。
option :代表用户希望查询的虚拟机信息,主要分成三类:类装载、垃圾收集、运行期编译状况。
例子:
① jstat -class 15043
显示加载class的数量,及所占空间等信息
解释:Loaded (装载的类的数量);Bytes(装载类所占用的字节数);Unloaded(卸载类的数量);Bytes(卸载类的字节数);Time(装载和卸载类所花费的时间)
② jstat -gc 15043
可以显示gc的信息,查看gc的次数,及时间。
解释:
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次数 |
YGCT | 从应用程序启动到采样时年轻代中gc所用时间(s) |
GCT | 从应用程序启动到采样时gc用的总时间(s) |
③jstat -gccapacity 15043
可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
NGCMN |
年轻代(young)中初始化(最小)的大小(字节) |
NGCMX |
年轻代(young)的最大容量 (字节) |
NGC |
年轻代(young)中当前的容量 (字节) |
S0C |
年轻代中第一个survivor(幸存区)的容量 (字节) |
S1C |
年轻代中第二个survivor(幸存区)的容量 (字节) |
EC |
年轻代中Eden(伊甸园)的容量 (字节) |
OGCMN |
old代中初始化(最小)的大小 (字节) |
OGCMX |
old代的最大容量(字节) |
OGC |
old代当前新生成的容量 (字节) |
OC |
Old代的容量 (字节) |
PGCMN |
perm代中初始化(最小)的大小 (字节) |
PGCMX |
perm代的最大容量 (字节) |
PGC |
perm代当前新生成的容量 (字节) |
PC |
Perm(持久代)的容量 (字节) |
YGC |
从应用程序启动到采样时年轻代中gc次数 |
FGC |
从应用程序启动到采样时old代(全gc)gc次数 |
④ jstat -gcutil 15043 统计gc信息 已用空间占总空间的比值
S0 |
年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 |
S1 |
年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 |
E |
年轻代中Eden(伊甸园)已使用的占当前容量百分比 |
O |
old代已使用的占当前容量百分比 |
P |
perm代已使用的占当前容量百分比 |
YGC |
从应用程序启动到采样时年轻代中gc次数 |
YGCT |
从应用程序启动到采样时年轻代中gc所用时间(s) |
FGC |
从应用程序启动到采样时old代(全gc)gc次数 |
FGCT |
从应用程序启动到采样时old代(全gc)gc所用时间(s) |
GCT |
从应用程序启动到采样时gc用的总时间(s) |
⑤ jstat -gccause 7594 与gcutil相似,额外输出导致上次GC的原因
⑥jstat -compiler 7594 输出JIT编译器编译过的方法、耗时等信息。
⑥ jstat -printcompilation 7594 输出已经被编译器编译的方法。
3.jinfo: Java配置信息工具。
作用:实时的查看和调整虚拟机各项参数。
例子:
使用jinfo来打开虚拟机GC日志打印参数
jinfo -flag +PrintGC 7594
jinfo -flag +PrintGCDDetails 7594
关闭:
jinfo -flag -PrintGC 7594
jinfo -flag -PrintGCDDetails 7594
如果抛异常则表示不能修改。
4. jmap(Memory Map for Java ):Java 内存映像工具
用于生成堆转储快照。
命令格式:jmap [option] vmid
例子:
① jmap -dump:live,format=b,file=d:/aaa.bin 7420 生成Java堆转储快照放在D:/aaa.bin
②jmap -heap 7420 显示堆详细信息
能看出来是使用的是parallel 垃圾收集器,并且是四个线程。
③jmap -histo:live 7420 查看对象。
num #instances #bytes class name
1 1 16 sun.security.util.ByteArrayLexOrder
5.jhat (Java Heap Analysis Tool) 虚拟机堆转储快照分析工具。
与jmap搭配使用。用于分析jmap生成的堆转储快照。
jhat aaa.bin
然后浏览器输入127.0.0.1:7000就能访问分析结果。
6.jstack:(Stack Trace for java)
用于生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法栈的集合,生成线程快照的目的就是定位线程出现
长时间停顿的原因:如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程出现长时间停顿的原因。
格式:jstack [option] vmid