虚拟机性能监控与故障工具
名称 | 主要作用 |
---|---|
jps | 显示指定系统内所有的HotSpot虚拟机进程 |
jstat | 用于收集HotSpot虚拟机各方面的运行数据 |
jinfo | 显示虚拟机配置信息 |
jmap | 生成虚拟机的内存转储快照(heapdump文件) |
jhat | 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 |
jstack | 显示虚拟机的线程快照 |
jps:虚拟机进程状况工具
jsp命令格式:
jps [options] [hostid]
jps 工具主要选项
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是Jar包,输出Jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
jstat:虚拟机统计信息监控工具
jstat命令格式:
jstat [option vmid [interval [s|ms] [count]] ]
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。
假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:
jstat -gc 2764 250 20
选项option代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运
行期编译状况,其体选项及作用请参考下表的描述。
jstat工具主要选项
选项 | 作用 |
---|---|
-class | 监控类装载、卸载数量、总空间以及装在所耗费的时间 |
-gc | 监视Java堆状况,包括Eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息 |
-gccapacity | 监控内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcnew | 监视新生代GC状况 |
-gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC状况 |
-gcoldcapacity | 监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-compiler | 输出JIT编译器编译过的方法、耗时等信息 |
-printcompilation | 输出已经被JIT编译的方法 |
jinfo:Java配置信息工具
jinfo命令格式:
jinfo [option] pid
jmap:Java内存映像工具
jmap命令格式:
jmap [option] vmid
option选项的合法值与具体含义见下表
选项 | 作用 |
---|---|
-dump | 生成Java堆转储快照。格式为:-dump:[ live, ] format=b, file=,其中live子参数说明是否只dump出存活的对象 |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效 |
-heap | 显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台下有效 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效 |
-F | 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效 |
jhat:虚拟机堆转储快照分析工具
Sun JDK提供jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。(一般不会直接使用jhat命令来分析dump文件,原因有两点:1,一般不会在部署应用程序的服务器上直接分析dump文件,即使这样做,一般也尽量把dump文件复制到其他机器上去分析,因为分析是一个耗时且消耗硬件资源的一个过程,既然都要在其他机器上运行了,就没有必要受到命令行工具的限制了;2,jhat的分析功能相对来说比较丑陋。
jstack:Java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照线程快照就是当前虚拟机内每–条线程正在执行的方法堆
栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死
循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停
顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么东西,或者等待着什么资源。
jstack命令格式:
jstack [option] vmid
option选项的合法值与具体含义见下表
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
在JDK1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成了jstack的大部分功能,在实际项目中不妨调用这个方法做个管理员界面,可以随时使用浏览器来查看线程堆栈,如下面代码清单所示:
<%@ page import = "java.util.Map" %>
<html>
<head>
<title>服务器线程信息</title>
</head>
<body>
<pre>
<%
for(Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()){
Thread thread = (Thread)stackTrace.getKey();
StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue();
if(thread.equals(Thread.currentThread())){
continue;
}
out.print("\n线程:" + thread.getName() + "\n");
for(StackTraceElement element : stack){
out.print("\t" + element + "\n");
}
}
%>
</pre>
</body>
</html>