I.JVM性能监控的常用命令行工具:

(1) jps(JVM Process Status):虚拟机进程状况监控工具
可以列出正在运行的虚拟机进程信息,并显示虚拟机执行主类(Main Class,main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID(LVMID,Local Virual Machine Identifier)。功能比较单一,但是由这条命名查询出来的LVMID通常作为其他命令的输入。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的。如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖jps命令显示主类的功能来区分了。 jps 命令格式: jps [options] [hostid] ps:jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程的状态,hostid为RMI注册表中注册的主机名。

jps -q 只输出LVMID,省略主机名称:
$ sudo jps -q 
16756
18022
2124
6123

jps -m 输出虚拟机进程启动时传递给主类main()函数的参数:
$ sudo jps -m
3871 Jps -m
16756 TailfileBootstrap
18022 Bootstrap start
6123 jar

jps -l 输出主类的全名,如果进程执行的是jar包,输出jar路径:
$ sudo jps -l
4385 sun.tools.jps.Jps
16756 com.taobao.timetunnel.tailfile.TailfileBootstrap
18022 org.apache.catal

jps -v 输出虚拟机启动时JVM参数:
$ sudo jps -v

jstat(JVM statistics Monitoring Tool) 虚拟机统计信息监视工具:
jstat 命令格式为:jstat [option vmid [interval] [s|ms] [count]]
ps:如果是本地进程,VMID和LVMID是一致的,如果是远程进程,那VMID的格式是:[protocol:][//]lvmid[@hostname]:port]/servername]

jps主要查询的信息包含三类,类装载,垃圾收集信息和运行时编译状况。

(2)jstat -class 监视类装载、卸载数量、总空间及类装载所耗费的空间:
$ sudo jstat -class 18022
Loaded Bytes Unloaded Bytes Time 
9724 19514.9 398 664.8 21.45

jstat -gc 监视java堆的状况,包括eden区、2个survivor区,老年代、永久带的容量、已用的空间、gc时间合计等信息。(这个命令输出的容量大小的但是是KB,时间单位是S)

$ sudo jstat -gc 18022 1s 10
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 
5632.0 5184.0 992.1 0.0 316864.0 82513.5 458752.0 200222.1 98560.0 67789.0 94 4.133 31 23.574 27.707

jstat -gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
$sudo jstat -gcutil 18022 1s 10
S0 S1 E O P YGC YGCT FGC FGCT GCT 
0.00 0.00 14.35 43.34 68.67 95 4.140 32 24.300 28.440

jstat -gccapacity 监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间

$ sudo jstat -gccapacity 18022 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 327680.0 327680.0 327680.0 4864.0 5184.0 316864.0 458752.0 458752.0 458752.0 458752.0 98304.0 262144.0 98560.0 98560.0 95 32

(ps:字段的含义 NGCMN 新生代最小内存的使用量,NGCMX 新生代最大内存的使用量,NGCMX 代表新生代最大内存的使用量,其他的用大腿猜猜应该就知道了)

(3)jinfo(Configuration info for java) java配置信息工具:作用是实时的查看和调整虚拟机的各项参数。jinfo 的命令格式 jinfo [option] pid. 使用jps命令的-v参数可以查看虚拟机启动用时显示指定的参数列表,但如果想知道未被显示指定的参数的系统的默认值,除了找资料外,就只能使用jinfo的-flag选项进行查询了。

jinfo -sysprops 可以把虚拟机进程的System.getProperties()的内容打印出来。

(4)jmap(Memory Map for java) java内存映像工具:

jmap命令用于生成堆转储快照,如果不适用map命令,要想获取java堆转储快照还有一些比较“暴力”的手段,譬如通过-XX:HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成DUMP文件,通过-XX:HeapDumpOnCtrlBreak可以让虚拟机生成dump文件,又或者在Linux系统下通过Kill -3 命令发送进程退出信号 “恐吓” 一下虚拟机,也能拿到dump文件。

ps:jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列,java堆和永久代的详细信息,如空间使用率、当前用的是哪中收集器。

jmap 命令格式: jmap[option] vmid

jmap -dump:生成java堆转储快照。格式为:-dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象。

jmap -finalizerinfo 显示在F -Queue中等待Finalizer线程执行finalize方法的对象,只在linux/Solaris平台下有效。

$ sudo jmap -finalizerinfo 18022 Attaching to process ID 18022, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.0-b12-internal Number of objects pending for finalization: 0

jmap - heap 显示java堆的详细信息,如使用哪种回收器,参数配置,分代状况等。

$ sudo jmap -heap 18022
Attaching to process ID 18022, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.0-b12-internal

using thread-local object allocation. Parallel GC with 2 thread(s)

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 805306368 (768.0MB)
NewSize = 335544320 (320.0MB)
MaxNewSize = 335544320 (320.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 100663296 (96.0MB)
MaxPermSize = 268435456 (256.0MB)

(ps: newRation 表示 新生代和老生代的堆内存占用比例,SurvivorRatio 表示survivor和eden的比例,MinHeapFreeRation:表示GC后,如果发现空闲堆内存占到整个预估上限值为该参数指定的值,则增大上限值,MaxHeapFreeRatio:表示GC后,如果发现空闲堆内存占整个预估上限值为该参数指定的值,则减小上限值。这两个参数主要结合Xmx和Xms使用)。

jmap -F 当虚拟机进程对-dump没有响应时,可使用这个选项强制生成dump快照。

(5)jhat(JVM Heap Analysis Tool):虚拟机堆转储快照分析工具
命令与jmap命令搭配使用,来分析jmap生成的堆转储快照。
jhat内置了一个微型的http/html服务器,生成dump文件分析成结果后可以在浏览器中查看。

(6)jstack: java堆栈跟踪工具
jstack(Stack Trace for java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump 或javacore 文件)。生成线程快照的主要目的是定位线程长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致长时间等待都是导致线程长时间停顿的常见原因。

jstack 命令格式: jstack [option] vmid

jstack -F:当正常输出的请求不被响应时,强制输出线程堆栈。
jstack -l:除堆栈外,显示关于锁的附加信息。
jstack -m:如果调用本地方法的话,可以显示C/C++的堆栈。
(ps: 在JDK1.5中,java.lang.Thread 类新增了一个getAllStackTrace()方法用于虚拟机中所有线程的StackTraceElement对象)

打印所有线程堆栈的code Demo:

public class JVMThreadMonitor {

    public static void main(String[] args) {

        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;
            }
            System.out.println("\n线程:"+thread.getName()+"\n");
            for(StackTraceElement element : stack) {
                System.out.println("\t"+element+"\n");
            }
        }
    }
}

(7)JDK的可视化工具: JConsole:能搜索出本地机器(或者连接到远程机器上)上运行的所有JVM进程实例,并进行图像化的监控。(这里遇到一个问题就是JConsole连接不上远程的服务器?设置了好久没有找到原因,求反馈)。
VisualVM: 多合一故障处理工具:
VisualVM(All-in-One Java Troubleshooting Tool) 是到目前为止,随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在将来一段时间内都是官方主力发布的虚拟机故障处理工具。
BTrace:动态日志跟踪:
BTrace是一个很有趣的VisualVM插件,本身也是可以独立运行的程序。它的作用是在不停止目标程序运行的前提下,通过HotSpot虚拟机的HotSwap技术动态的加入原本并不存在的调试代码。

刚才在csdn上问到了连接远程的方法:在程序启动的时候,服务端加上如下启动参数就搞定了:

  1. -Djava.rmi.server.hostname={服务器端Ip}
  2. -Dcom.sun.management.jmxremote.port=9880  
  3. -Dcom.sun.management.jmxremote.ssl=false   
  4. -Dcom.sun.management.jmxremote.authenticate=false 


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐