一. JVM数据
JVM中的数据包括:运行日志,异常堆栈,GC日志,线程快照(threaddump/javacore文件),堆转储快照(headdump/hprof文件)。
二. JDK的命令行工具
JDK bin目录下的有许多命令行工具,比如java.exe与javac.exe。Sun公司也提供了对JVM监控和故障处理的工具。
三. 工具详解
1.JVM Process Status Tool(jps)
列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class)的名称,以及这些进程在本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)。
选项 | 作用 |
Jps -q | 只输出LVMID,缺省主类名称 |
-m | 输出虚拟机进程启动时传给主类Main函数的参数 |
-l | 输出主类的全名 |
-v | 输出虚拟机进程启动时JVM参数 |
2.JVM Statistics Monitoring Tool (jstat)
用于监视虚拟机各种运行状态信息的命令行工具,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据。是虚拟机运行期定位虚拟机性能问题的首选工具。
Jstat的命令格式为:jstat -[<option> <vmid> [<interval> [<count>]]。
- vmid如果是本地虚拟机进程,则VMID与LVMID一致;如果是远程虚拟机进程,VMID格式为:[protocol:] [//] lvmid[@localhost[;port]/servername]
- Interval:代表查询间隔
- Count:代表查询次数
- Option:代表用户希望查询的虚拟机信息,主要分为3类:类装载,GC,运行期编译情况。
option选项
选项 | 作用 |
-class | 监视类装载,卸载数量,总空间以及类装载所耗费时间 |
-gc | 监视java堆的情况,包括Eden区,两个survivor区,老年代,永久代,已用空间等信息 |
-gccapacity | 监视内容与gc基本相同,但主要输出Java堆各个区域用到的最大空间和最小空间 |
-gcutil | 监视内容与gc基本相同,但主要关注已用空间占总空间百分比 |
-gccause | 与-gcutil功能一样,但是会额外输出上次GC产生原因 |
-gcnew | 监视新生代GC |
-gcnewcapacity | 监视内容与-gcnew相同,输出主要关注使用到的最大空间与最小空间 |
-gcold | 监视老年代GC |
-gcoldcapacity | 监视内容与-gcold相同,输出主要关注使用到的最大空间与最小空间 |
-gcpermcapacity | 输出永久代使用到的最大空间和最小空间 |
-compiler | 输出JIT编译器编译过的方法,耗时等信息。 |
-printcompilation | 输出已经被JIT编译的方法 |
3.Configuration Info for Java(Jinfo)
实时查看和调整虚拟机的各项参数。jps -v虚拟机启动时显式指定的参数列表,Jinfo参数的命令格式:jinfo [option] pid;
选项 | 作用 |
-flag | 未被显式指定的参数的系统默认值 |
-sysprops | 把虚拟机进程的System.getProperties( )的内容打印出来 |
-flag name=value | 修改一部分运行期可写的虚拟机参数值 |
4.Memory Map for java(Jmap)
用于生成堆转储快照(一般称为heapdump或dump文件)以及查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率,GC器等。Jmap的命令格式:jmap [option] pid。
option选项如下
选项 | 作用 |
-dump | 生成Java堆转储快照,格式为-dump:[live,]format=b,file=<filename>,live参数说明是否只dump出存货对象 |
-finalizerinfo | 显式在F-Queue中等待Finalizer线程执行finalize方法的对象,只在linux于solars平台有效 |
-heap | 显式Java堆的详细信息,如参数配置,分代情况,哪种GC器,只在linux于solars平台有效 |
-histo | 显示堆中对象统计信息,包括类,实例的数量和合计容量 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态 |
-F | 当虚拟机进程对-dump选项无效时,可以使用这个强制生成dump快照 |
5.JVM Heap Analysis Tool(Jhat)
Jhat搭配Jmap命令使用,用于分析jmap生成的堆存储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件与分析结果后,可以在浏览器中查看。一般不会使用jhat分析dump文件,原因如下:1.分析耗时而且消耗硬件资源;2.jhat分析功能比较简陋,不如VisualVM,IBM HeapAnalyzer等工具
6.Stack Trace of Java(jstack)
用于生成虚拟机当前时刻的线程快照(一般称为threadheap或javacore文件)。线程快照是当前虚拟机内部每一条正在执行的方法堆栈的集合。生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程死锁,死循环,请求外部资源导致长时间等待。jstack命令格式:
jstack [option] vmid
选项 | 作用 |
-F | 当正常输出请求不被响应时 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用本地方法的话,可以显示c/c++的堆栈 |