熟悉java的人都知道jdk的bin目录中有很多小工具,其中就包括用于监视虚拟机和故障处理的工具,今天就来仔细了解下各个工具的用法
jps
JVM Process Status Tool,用于显示指定系统的内所有的Hotapot的虚拟机进程
1.用法
jps [options] [hostid]
2.参数列表
q:只输出LVMID,省略主类的名称 m:输出虚拟机进程启动时传递给主类main()函数的参数 l:输出主类的全名。若进程执行的是jar包,则输出jar路径 v:输出虚拟机进程启动时JVM参数
3.实际举例:
1. jps -q :只输出LVMID,省略主类的名称
2. jps -m:输出虚拟机进程启动时传递给主类main()函数的参数
3.jps -l:输出主类的全名。若进程执行的是jar包,则输出jar路径
4.jps -v:输出虚拟机进程启动时JVM参数
5.参数 vl一起:这样我们就能很方便的查看各个程序设定的参数了
jstat
Java Statisstic Monitoring Tool :一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量
1.用法
jstat [Options] vmid [interval] [count] Options,选项,我们一般使用 -gcutil 查看gc情况vmid,VM的进程号,即当前运行的java进程号interval,间隔时间,单位为秒或者毫秒count,打印次数,如果缺省则打印无数次
2.参数列表
jstat -class pid:显示加载class的数量,及所占空间等信息。 jstat -compiler pid:显示VM实时编译的数量等信息。 jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。 jstat -gcnew pid:new对象的信息。 jstat -gcnewcapacity pid:new对象的信息及其占用量。 jstat -gcold pid:old对象的信息。 jstat -gcoldcapacity pid:old对象的信息及其占用量。 jstat -gcpermcapacity pid: perm对象的信息及其占用量。 jstat -util pid:统计gc信息统计。 jstat -printcompilation pid:当前VM执行的信息。 除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
3.实际举例
1. -gc:监视java堆状况
S0C:年轻代中第一个survivor(幸存区)的容量 (字节) S1C:年轻代中第二个survivor(幸存区)的容量 (字节) S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC:年轻代中Eden的容量 (字节) EU:年轻代中Eden目前已使用空间 (字节) OC:Old代的容量 (字节) OU:Old代目前已使用空间 (字节) PC:Perm(持久代)的容量 (字节) PU:Perm(持久代)目前已使用空间 (字节) YGC:从应用程序启动到采样时年轻代中gc次数
2.-gcutil:与-gc基本相同,但输出的是已使用空间占总空间的大小
jinfo
Configuration Info for Java:实时的查看和调整虚拟机各项参数
1.用法:
jinfo [option] <pid>
2.参数:
jinfo 主要就是flag参数了,上图已经解释的很清楚了,这里直接做演示好了
3.实际举例
1.获取进程30018的SurvivorRatio信息
2.获取进程30018 所有的jvm信息
这个命令比jps -v更加详细
jmap
打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成 文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC 回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将3024进 程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool)或与jhat (Java Heap Analysis Tool)一起使用, 能够以图像的形式直观的展示当前内存是否有问题。
1.用法
jmap [option] <pid>
2.参数
1)、options: executable Java executable from which the core dump was produced. (可能是产生core dump的java可执行程序) core 将被打印信息的core dump文件 remote-hostname-or-IP 远程debug服务的主机名或ip server-id 唯一id,假如一台主机上多个远程debug服务 2)、基本参数: -dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. -finalizerinfo 打印正等候回收的对象的信息. -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况. -histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. -permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效. -h | -help 打印辅助信息 -J 传递参数给jmap启动的jvm. pid 需要被打印配相信息的java进程id
3.实际举例
1.jmap -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
这个命令非常直观的显示了JVM各个区域的生存情况,线上还款内存出现异常可以先用这个命令做一个大致的了解
2.jmap -histo:
这个命令会把所有的类都打出来,并按占用内存的大小进行排序
3.jmap -dump:
解释下 jmap -F -dump:format=b,file=payment.bin 30018: 使用hprof二进制形式,输出进程为30018的jvm的heap内容到文件payment.bin
jhat
是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言
我们现在来分析下上文产生的payment.bin
用浏览器访问http://localhost:7000/,会发现所有的类按包名进行分类,我们可以访问底部的这个标签,看到的内容和jmap -histo:是一样的
参考
http://www.cnblogs.com/ggjucheng/archive/2013/04/16/3024986.html
http://blog.csdn.net/zlzlei/article/details/46471627
原文地址:https://www.cnblogs.com/xmzJava/p/8524949.html