** 本文中使用到的JDK 为 Oracle JDK 1.7 **
JDK本身提供了很多方便的JVM性能调优监控工具,除了jps、jstat、jinfo、jmap、jhat、jstack等小巧的工具,还有集成式的jvisualvm和jconsole。
这些工具在 $JAVA_HOME/bin目录下:
jps
jps(JVM Process Status Tool,虚拟机进程监控工具),这个命令可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及这些进程的本地虚拟机唯一ID。这个ID被称为本地虚拟机唯一ID(local virtual Machine Identifier,简写为LVMID)。如果你在linux的一台服务器上使用jps得到的LVMID其实就是和ps 命令得到的PID是一样的。
语法格式如下:
jps [options] [hostid]
如果不指定hostid就默认为当前主机或服务器。
options参数选项说明如下:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
使用
1、查看所有java进程
jps -lv
jinfo
jinfo (Configuration Info for Java,配置信息工具)
这个命令可以实时地查看和调整虚拟机各项参数。
主要参数如下:
使用
1、查看2788的MaxPerm大小可以用
jinfo -flag MaxPermSize 2788
输出结果:
[root@Bill-8 bin]# jinfo -flag MaxPermSize 577
-XX:MaxPermSize=134217728
jhat
jhat(虚拟机堆转储快照分析工具),这个工具是用来分析jmap dump出来的文件。
由于这个工具功能比较简陋,运行起来也比较耗时,所以这个工具不推荐使用,推荐使用MAT。
例如分析dump出来的test.bin,命令如下:
jhat test.bin
它会在本地启动一个web服务,端口是7000,这样直接访问 127.0.0.1:7000就能看到分析结果了。
jmap
jmap(Memory Map for Java,内存映像工具),用于生成堆转存的快照,一般是heapdump或者dump文件。如果不适用jmap命令,可以使用-XX:+HeapDumpOnOutOfMemoryError参数,当虚拟机发生内存溢出的时候可以产生快照。或者使用kill -3 pid也可以产生。jmap的作用并不仅仅是为了获取dump文件,它可以查询finalize执行队列,java堆和永久代的详细信息,如空间使用率,当前用的哪种收集器。
jmap的命令格式:
jmap [option] vmid
主要参数如下:
option参数说明:
- -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.
64位机上使用需要使用如下方式:
jmap -J-d64 -heap pid
使用
1、打印每个class的实例数目,内存占用,类全名信息
jmap -histo 577
2、dump heap内容到文件
jmap -dump:format=b,file=test.bin 577
jstat
jstat(JVM Statistics Monitoring Tool,虚拟机统计信息监视工具),这个命令用于监视虚拟机各种运行状态信息。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,虽然没有GUI图形界面,只是提供了纯文本控制台环境的服务器上,但它是运行期间定位虚拟机性能问题的首选工具。
语法格式如下:
jstat [option vmid [interval [s | ms] [count ] ] ]
vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。
jstat的参数说明如下(截图来自周志明的《深入理解Java虚拟机 第二版》):
使用
例如:需要每250毫秒查询一次进程2849 垃圾收集状况,一共查询20次,那命令如下:
jstat -gc 2849 250 20
jstack
jstack(Java Stack Trace,Java堆栈跟踪工具),这个命令用于查看虚拟机当前时刻的线程快照(一般是threaddump 或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,入线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情。
命令格式:
jstack [option] vmid
主要的option如下:
使用
1、查看进程2849 的堆栈信息
[root@Bill-8 yrd_soft]# jstack 2849
jconsole
jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选则进程就可以了。
启动:
概览
内存
线程:
类:
VM概要:
jvisualvm
jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入jvisualvm即可启动,jvisualvm界面更美观一些,数据更实时:
监控:
线程监控:
参考资料
周志明 《深入理解Java虚拟机 第二版》