虚拟机性能监控与故障处理工具------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生成代码反汇编

 

 

posted @ 2017-07-23 17:26  竹马今安在  阅读(331)  评论(0编辑  收藏  举报