虚拟机性能监控与故障处理工具------JDK的命令行工具
①jps:虚拟机进程状况工具
功能:列出正在运行的虚拟机进程,并显示1、虚拟机执行主类名称以及2、这些进程的本地虚拟机唯一ID(LVMID)。
使用频率最高的JDK命令行工具,其他的JDK工具大多需要输入它查询到的LVMID来确定监控的是哪一个虚拟机进程。
对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID)是一致的,使用Windows的任务管理器也可以查询到虚拟机进程的LVMID,但如过同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖jps命令显示主类的功能才能区分了
jps命令格式:jps[options][hostid]
jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
jps工具主要选项
选项 | 作用 |
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-1 | 输出主类的全名,如果进程执行的是Jar包,输出Jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
②jstat:虚拟机统计信息监视工具
作用:用户监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能的首选工具。
命令格式为:jstat[ option vmid [interval[s|ms] [count] ]]
vmid:如果是本地虚拟机进程,则和LVMID一致,如果是远程虚拟机进程,那VMID的格式应该是:[protocol:][//]lvmid[@hostname[:port]/servername]
intervale和count代表查询间隔和次数,如果省略,说明只查询一次。
option代表着用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况
③jinfo:java配置信息工具
作用:实时地查看和调整虚拟机各项参数
命令格式:jinfo[option] pid
使用jps的-v参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显示指定的参数的系统默认值,使用jinfo的-flag选项进行查询,还可以使用-flag[+|-] name 修改参数
④jmap:java内存映像工具
功能:用于生成堆转储快照,查询finalize执行队列,java堆和永久代的详细信息。
命令格式:jmap [ option] vmid
选项 | 作用 |
-dump | 生成Java堆转储快照 |
-finalizerinfo | 显示在F-Queue中等待Finalize执行finalize的对象,Linux/Solaris平台有效 |
-heap | 显示java堆详细信息,Linux/Solaris平台有效 |
-histo | 显示堆中对象统计信息 |
-permstat | 以classLoader为统计口径显示永久代内存状态,Linux/Solaris平台有效 |
-F | 当虚拟机进程对-dump指令没有响应,强制生成快照,Linux/Solaris平台有效 |
⑤ jhat :虚拟机堆转储快照分析工具
功能:与jmap搭配使用,来分析jmap生成的堆转储快照
⑥jstack:java堆栈跟踪工具
功能:用于生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的元婴
命令格式:jstack [option] vmid
选项 | 作用 |
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
在JDK1.5中,Thread类提供了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象,使用这个方法可以完成jstack的大部分功能。
用这个方法做一个管理员界面,可以随时随地查看线程堆栈
1 <body> 2 <pre> 3 <% 4 for(Map.Entry<Thread,StackTraceElement[]> stackTrace:Thread.getAllStackTraces().entrySet()){ 5 Thread thread=(Thread) stackTrace.getKey(); 6 StackTraceElement[] stack=(StackTraceElement[]) stackTrace.getValue(); 7 if(thread.equals(Thread.currentThread())){ 8 continue; 9 } 10 out.print("\n线程:"+thread.getName()+"\n"); 11 for(StackTraceElement element:stack){ 12 out.print("\t"+element+"\n"); 13 14 } 15 16 } 17 18 19 %> 20 </pre> 21 </body>
⑦HSDIS:JIT生成代码反汇编