1.关于Java命令之jstat
是用于监控虚拟机各种运行状态信息的命令工具,包括了堆Heap size和垃圾回收状况的监控。
jstat命令格式:
参数含义:
option:选项,我们一般使用-gc查看gc情况
vmid:VM的进程号,即当前运行的Java进程号
interval:间隔时间,单位为秒或毫秒
count:打印次数,如果缺省则打印无数次
注:interval和count代表查询间隔和打印次数,若省略这两个参数,则只查询一次。假设需要每200毫秒查询一次当前Java进程垃圾收集情况,一共查询5次,则:
option
代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项和作用如下:
常见命令组合:
jstat -class pid:显示加载class的数量及所占空间等信息。其中:loaded表示类装载的数量;bytes表示装载类的字节数;unloaded表示卸载类的数量;bytes表示卸载类的的字节数;time表示装载和卸载类所用的时间。
jstat -compiler pid:显示VM实时编译的数量等信息。其中:compiled表示编译任务执行数量;failed表示编译任务失败的次数;invalid表示编译任务失效的数量;time表示编译任务消耗的时间;failedType表示最后一个编译失败任务的类型;failedMethod表示最后一个编译任务失败所在的类及方法。
jstat -gc pid:显示gc信息,查看次数及时间。其中:s0c表示年轻代中第一个survivor(幸存区)的字节容量;s1c年轻代中第二个survivor的容量;s0u表示年轻代第一个survivor已使用空间;s1u表示年轻代第二个survivor已使用空间;ec表示Eden的容量;eu表示Eden的已使用空间;oc表示老年代的容量;ou表示老年代已使用的空间;mc表示Perm(持久代)的容量;mu持久代已使用空间;YGC表示从程序启动到采样时年轻代中gc次数;YGCT表示从程序启动到采样时年轻代gc所用时间;FGC从程序启动到采样时old代gc次数;FGCT表示时间;GCT程序启动到采样时gc的总时间。
jstat -gccapacity pid:可以显示在VM内存中三代对象的使用和占用大小。其中NGCMN表示年轻代中初始化(最小)的大小;NGCMX表示年轻代初始化(最大)的大小;NGC表示年轻代中当前的容量;S0C、S1C和EC同上;OGCMN老年代初始化(最小)的大小;OGCMX老年代初始化(最大)的大小;OGC老年代当前新生成的容量;OC老年代的容量;其他同上。
jstat -gcutil pid:统计gc信息。s0年轻代第一个survivor已使用的占当前容量百分比;s1年轻代第二个survivor百分比;E表示Eden已使用的占当前容量百分比;O表示老年代的百分比;M表示持久代的百分比;其他同上。
jstat -gcnew pid:年轻代对象的信息。TT持有次数限制;MTT最大持有次数限制。
jstat -gcnewcapacity pid:年轻代对象的信息及其占用量。
jstat -gcold pid:old代对象的信息。
jstat -gcoldcapacity pid:old代对象的信息及其占用量。
jstat -printcompilation pid:当前VM执行的信息。
2.关于Java命令之jinfo
此命令可以输出Java进程、core文件或远程debug服务器的配置信息,这些配置信息包括JAVA系统参数及命令行参数。
让我们jinfo pid试一下:
3.关于Java命令之jhat
jhat的全名为Java Heap Analysis Tool,即是一个用来分析java堆情况的命令。如用jmap生成dump文件,然后用jhat来查看。
导出Dump文件:
先生成Dump文件:jmap -dump:format=b,file=<fileName> pid
然后解析Java堆转储文件,并启动一个web server:jhat <fileName> 会启动一个端口,访问localhost+端口号就可以了。
分析
一般查看堆异常情况主要看这两个部分(在浏览器页面最下边):
打开如图:
具体排查时需要结合代码,观察是否大量应该被回收的对象在一直被引用或是否有占用内存特别大的对象无法被回收。
参考资料:http://www.hollischuang.com/archives/308