性能监控工具
定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。
top
top:显示系统整体资源使用情况 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
在Linux使用top命令的部分输出如下:
top - 16:30:03 up 3 min, 0 users, load average: 0.00, 0.00, 0.00
Tasks: 7 total, 1 running, 6 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 12272.9 total, 12101.2 free, 113.9 used, 57.7 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 11983.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 920 532 476 S 0.0 0.0 0:00.03 init
9 root 20 0 1268 372 20 S 0.0 0.0 0:00.00 init
10 root 20 0 1268 372 20 S 0.0 0.0 0:00.01 init
11 yjj 20 0 9188 5172 3412 S 0.0 0.0 0:00.03 bash
73 root 20 0 10972 4504 3696 S 0.0 0.0 0:00.02 su
74 root 20 0 8152 4048 3468 S 0.0 0.0 0:00.00 bash
81 root 20 0 10760 3324 2964 R 0.0 0.0 0:00.03 top
top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息。
在统计信息中:
- 第1行是任务队列信息,从左到右依次表示:系统当前时间、系统运行时间、当前登录用户,最后的load average表示系统的平均负载。
- 第2行是进程统计信息,分别有正在运行的进程数、睡眠进程数、停止的进程数、僵尸进程数。
- 第3行是CPU统计信息,us表示用户空间CPU占用率,sy表示内核空间CPU占用率、ni表示用户进程空间改变过优先级的进程cpu的占用率、id表示空闲cpu占用率、wa表示等待输入输出的CPU时间百分比、hi表示硬件中断请求、si表示软件中断请求。
在进程信息区中,显示了系统各个进程的资源使用情况。主要字段的含义:
- PID:进程id
- USER:进程所有者的用户名
- PR:优先级
- NI:nice值,负值表示高优先级,正值表示低优先级
- S: 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- VIRT 进程使用的虚拟内存总量 VIRT=SWAP+RES
- %CPU 上次到现在CPU更新时间百分比
- %MEM 进程使用的物理内存百分比
- RES 进程使用的未被唤出的内存大小,单位kb RES=CODE+DATA
- SHR 共享内存大小,单位kb
- TIME+:进程使用的CPU时间总计,单位1/100秒
- COMMAND:命令名/命令行
- CODE:可执行代码占用的物理内存大小,单位kb
- DATA: 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb top命令是一个非常强大的功能,但是它监控的最小单位是进程,如果想监控更小单位时,就需要用到ps或者netstate命令来满足我们的要求。
vmstat
vmstat:监控内存和CPU vmstat也是一款功能比较齐全的性能监测工具。它可以统计CPU、内存使用情况、swap使用情况能信息。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
> vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 12388548 10184 51756 0 0 1 128 0 2 0 0 100 0 0
0 0 0 12387996 10184 51756 0 0 0 0 3 24 0 0 100 0 0
0 0 0 12387996 10184 51756 0 0 0 0 4 26 0 0 100 0 0
以下命令表示每秒采样一次,共三次。
- Procs r: 运行队列中进程数量 b: 等待IO的进程数量
- Memory(内存) swpd: 使用虚拟内存大小 free: 可用内存大小 buff: 用作缓冲的内存大小 cache: 用作缓存的内存大小
- Swap: si: 每秒从交换区写到内存的大小 so: 每秒写入交换区的内存大小 IO:(现在的Linux版本块的大小为1024bytes) bi: 每秒读取的块数bo: 每秒写入的块数
- 系统 in: 每秒中断数,包括时钟中断 cs: 每秒上下文切换数
- CPU(以百分比表示) us: 用户进程执行时间(user time) sy: 系统进程执行时间(system time) id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 ,以百分比表示。 wa: 等待IO时间
iostat
iostat:监控IO使用 iostat可以提供磁盘IO的监控数据: 以上命令显示了CPU的使用概况和磁盘I/O的信息。
avg-cpu: %user %nice %system %iowait %steal %idle
1.44 0.00 0.39 0.00 0.00 98.17
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.37 0.47 30.30 3561197 229837730
dm-0 0.44 0.33 29.97 2518272 227313194
dm-1 0.12 0.13 0.33 1013276 2520308
dm-2 0.00 0.00 0.00 502 2068
输出结果各个列的含义:
iostat结果面板 avg-cpu 描述的是系统cpu使用情况:
- %user:CPU处在用户模式下的时间百分比。
- %nice:CPU处在带NICE值的用户模式下的时间百分比。
- %system:CPU处在系统模式下的时间百分比。
- %iowait:CPU等待输入输出完成时间的百分比。
- %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
- %idle:CPU空闲时间百分比。
netstat:监控网络使用
在web程序中,可能运行需要网络,可以使用netstat命令监控网络流量。
netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
udp 0 0 *:bootpc *:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket
...
以上命令表示列出所有端口信息。
JDK性能监控工具
除了我们比较熟悉的java.exe、javac.exe这两个命令行工具,在jdk的bin目录下,还有一些其它的工具。。除了编译和运行Java程序外,打包、部署、签名、调试、监控、运维等各种场景都可能会用到它们。 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!Sun JDK监控和故障处理命令如下:
命令 | 作用 |
---|---|
jps | JVM Process Status Tool显示指定系统内所有的HotSpot虚拟机进程。 |
jstat | JVM statistics Monitoring用于监视虚拟机运行时状态信息的命令 |
jinfo | JVM Configuration info这个命令作用是实时查看和调整虚拟机运行参数。 |
jmap | |
jhat | |
jstack |
jps
jps (JVM Process Status Tool) 的功能:可以列出正在运行的虚拟机进程,并显示虛拟机执行主类(Mam Class,main ( ) 函数所在的类)名称以及这些进程的本地虛拟机唯一ID ( Local Virtual Machine Identifier,LVMID ) 。 jps命令格式:
jps [ options ] [ hostid ]
jps命令类似于Linux下的ps命令,但它只用于列出Java的进程。直接运行jps命令不加任何参数,可以列出Java程序进程ID及Main函数名称,如下所示:
bin>jps
22400 ProgramCounterDemo
15384 Launcher
3016 Jps
从这个输出中可以看到,当前系统中共存在3个Java应用程序,其中第一个输出Jps就是jps命令本身,这更加证明此命令的本质也是一个Java程序。此外,jps命令还提供了一系列参数来控制它的输出内容。
jps的常用选项见表:
- -q 只输出进程 ID,忽略主类信息
- -l 输出主类全名,或者执行 JAR 包则输出路径
- -m 输出虚拟机进程启动时传递给主类 main()函数的参数
- -v 输出虚拟机进程启动时的 JVM 参数 参数-q可以指定jps只输出进程ID,而不输出类的名称: 参数-m可以用于输出传递给Java进程(主函数)的参数: 参数-l可以用于输出主函数的完整路径:
jstat
jstat( JVM Statistics Monitoring Tool )是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据是运行期定位虚拟机性能问题的首选工具。 jstat命令是一个可以用于观察Java应用程序运行时相关信息的工具。它的功能非常强大,可以通过它查看堆信息的详细情况。它的基本使用语法为:
jstat[option vmid[interval[s|ms][count]]]
jstat命令格式为:
jstat [ option vmid [interval[s|ms] [count]] ]
参数
- [option] : 操作参数
- LVMID : 本地虚拟机进程ID
- [interval] : 连续输出的时间间隔
- [count] : 连续输出的次数
对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与 LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:
jstat -gc 2764 250 20
option 参数总览
Option | Displays… |
---|---|
class | class loader的行为统计。Statistics on the behavior of the class loader. |
compiler | HotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler. |
gc | 垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap. |
gccapacity | 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces. |
gcutil | 垃圾回收统计概述。Summary of garbage collection statistics. |
gccause | 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and |
gcnew | 新生代行为统计。Statistics of the behavior of the new generation. |
gcnewcapacity | 新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces. |
gcold | 年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations. |
gcoldcapacity | 年老代行为统计。Statistics of the sizes of the old generation. |
gcpermcapacity | 永生代行为统计。Statistics of the sizes of the permanent generation. |
printcompilation | HotSpot编译方法统计。HotSpot compilation method statistics. |
选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况。
jstat工具主要选项:
- -class 监视类加载、卸载数量、总空间以及类装载所耗费时长
- -gc 监视 Java 堆情况,包括 Eden 区、2 个 Survivor 区、老年代、永久代或者 jdk1.8 元空间等,容量、已用空间、垃圾收集时间合计等信息
- -gccapacity 监视内容与-gc 基本一致,但输出主要关注 Java 堆各个区域使用到的最大、最小空间
- -gcutil 监视内容与-gc 基本相同,但输出主要关注已使用空间占总空间的百分比
- -gccause 与 -gcutil 功能一样,但是会额外输出导致上一次垃圾收集产生的原因
- -gcnew 监视新生代垃圾收集情况
- -gcnewcapacity 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间
- -gcold 监视老年代垃圾收集情况
- -gcoldcapacity 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间
- -compiler 输出即时编译器编译过的方法、耗时等信息
- -printcompilation 输出已经被即时编译的方法
option 参数详解
-class
监视类装载、卸载数量、总空间以及耗费的时间
$ jstat -class 11589 Loaded Bytes Unloaded Bytes Time 7035 14506.3 0 0.0 3.67
在-class的输出中,Loaded表示载入类的数量,Bytes表示载入类的合计大小,Unloaded表示卸载类的数量,第2个Bytes表示卸载类的大小,Time表示在加载和卸载类上所花的时间。
-compiler
输出JIT编译过的方法数量耗时等
$ jstat -compiler 1262
Compiled Failed Invalid Time FailedType FailedMethod
2573 1 0 47.60 1 org/apache/catalina/loader/WebappClassLoader findResourceInternal
Compiled表示编译任务执行的次数,Failed表示编译失败的次数,Invalid表示编译不可用的次数,Time表示编译的总耗时,FailedType表示最后一次编译失败的类型,FailedMethod表示最后一次编译失败的类名和方法名。
-gc
垃圾回收堆的行为统计,常用命令
$ jstat -gc 1262
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
26112.0 24064.0 6562.5 0.0 564224.0 76274.5 434176.0 388518.3 524288.0 42724.7 320 6.417 1 0.398 6.815
C即Capacity 总容量,U即Used 已使用的容量
- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1U : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- PC 当前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间
$ jstat -gc 1262 2000 20
这个命令意思就是每隔2000ms输出1262的gc情况,一共输出20次
-gccapacity
同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
$ jstat -gccapacity 1262
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
614400.0 614400.0 614400.0 26112.0 24064.0 564224.0 434176.0 434176.0 434176.0 434176.0 524288.0 1048576.0 524288.0 524288.0 320 1
- NGCMN : 新生代占用的最小空间
- NGCMX : 新生代占用的最大空间
- OGCMN : 老年代占用的最小空间
- OGCMX : 老年代占用的最大空间
- OGC:当前年老代的容量 (KB)
- OC:当前年老代的空间 (KB)
- PGCMN : perm占用的最小空间
- PGCMX : perm占用的最大空间
-gcutil
同-gc,不过输出的是已使用空间占总空间的百分比
$ jstat -gcutil 28920 S0 S1 E O P YGC YGCT FGC FGCT GCT 12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242
-gccause
垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
$ jstat -gccause 28920
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242 Allocation Failure No GC
- LGCC:最近垃圾回收的原因
- GCC:当前垃圾回收的原因
-gcnew
统计新生代的行为
$ jstat -gcnew 28920
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
419392.0 419392.0 52231.8 0.0 6 6 209696.0 3355520.0 1172246.0 4 0.242
- TT:Tenuring threshold(提升阈值)
- MTT:最大的tenuring threshold
- DSS:survivor区域大小 (KB)
-gcnewcapacity
新生代与其相应的内存空间的统计
$ jstat -gcnewcapacity 28920
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
4194304.0 4194304.0 4194304.0 419392.0 419392.0 419392.0 419392.0 3355520.0 3355520.0 4 0
- NGC:当前年轻代的容量 (KB)
- S0CMX:最大的S0空间 (KB)
- S0C:当前S0空间 (KB)
- ECMX:最大eden空间 (KB)
- EC:当前eden空间 (KB)
-gcold
统计旧生代的行为
$ jstat -gcold 28920
PC PU OC OU YGC FGC FGCT GCT
1048576.0 46561.7 6291456.0 0.0 4 0 0.000 0.242
-gcoldcapacity
统计旧生代的大小和空间
$ jstat -gcoldcapacity 28920
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
6291456.0 6291456.0 6291456.0 6291456.0 4 0 0.000 0.242
-gcpermcapacity
永生代行为统计
$ jstat -gcpermcapacity 28920
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
1048576.0 2097152.0 1048576.0 1048576.0 4 0 0.000 0.242
-printcompilation
hotspot编译方法统计
$ jstat -printcompilation 28920
Compiled Size Type Method
1291 78 1 java/util/ArrayList indexOf
- Compiled:被执行的编译任务的数量
- Size:方法字节码的字节数
- Type:编译类型
- Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项
jinfo
jinfo ( Configuration Info for Java ) 的作用是实时地查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于 JDK 1.6或以上版本的话,使用java-XX : +PrintFlagsFinal查看参数默认值也是一个很好的选择 ),jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties() 的内容打印出来。这个命令在JDK 1.5时期已经随着Linux版的JDK发 布 ,当时只提供了信息查询的功能 ,JDK 1.6之后,jinfo在Windows和Linux平台都有提供,并且加入了运行期修改参数的能力 ,可以使用-flag[+|-jname或者-flag name=value修改一部分运行期可写的虚拟机参数值。 JDK 1.6中,jinfo对手Windows平台功能仍然有较大限制,只提供了最基本的-flag选项。 jinfo命令可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时修改部分参数。它的基本语法为: jinfo命令格式:
jinfo [ option ] pid
其中option可以为以下信息。
·-flag
bin>jinfo -flag PrintGCDetails 22400
-XX:-PrintGCDetails
除了查找参数的值,jinfo命令也支持修改部分参数的数值,当然,这个修改能力是极其有限的。下例显示了通过jinfo命令对PrintGCDetails参数的修改,它可以在Java程序运行时,动态关闭或者打开这个开关。
bin>jinfo -flag +PrintGCDetails 22400
bin>jinfo -flag PrintGCDetails 22400
-XX:+PrintGCDetails
注意: 使用jinfo命令不仅可以查看运行时某一个Java虚拟机参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效(并非所有参数都支持动态修改)。
jmap
jmap ( Memory Map for Java ) 命令用于生成堆转储快照(一般称为heapdump或dump文件 )。如果不使用jmap命令,要想获取Java堆转储快照,还有一些比较“暴力”的手段:譬如-XX : +HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX : +HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break] 键让虚拟机生成dump文件 ,又或者在Linux系统下通过Kill -3命令发送进程退出信号“吓唬”下虚拟机,也能拿到dump文件。 jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。 和jinfo命令一样,jmap有不少功能在Windows平台下都是受限的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外 ,其余选项都只能在Linux/Solaris下使用。 jmap命令是一个多功能的命令。它可以生成Java程序的堆Dump文件,也可以查看堆内对象实例的统计信息、查看ClassLoader的信息及finalizer队列。 jmap命令格式:
jmap [ option ] vmid
jmap工具主要选项:
- -dump 生成 Java 堆转储快照。
- -finalizerinfo 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。Linux平台
- -heap 显示 Java 堆详细信息,比如:用了哪种回收器、参数配置、分代情况。Linux 平台
- -histo 显示堆中对象统计信息,包括类、实例数量、合计容量
- -permstat 显示永久代内存状态,jdk1.7,永久代
- -F 当虚拟机进程对 -dump 选项没有响应式,可以强制生成快照。Linux平台
下例使用jmap命令生成PID的Java程序的对象统计信息。
jhat
jhat:堆转储快照分析 JDK提供jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。
jstack
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为 threaddump或者javacore文件 )。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合 ,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。 jstack:Java堆栈跟踪。jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。 jstack命令格式:
jstack [ option ] vmid
jstack工具主要选项:
- -F 当正常输出的请求不被响应时,强制输出线程堆栈
- -l 除了堆栈外,显示关于锁的附加信息
- -m 如果调用的是本地方法的话,可以显示 c/c++的堆栈
jstack命令会在控制台输出程序中所有的锁信息,可以使用重定向将输出保存到文件中,如:
jstack -l xxx > c:/dead.txt
jcmd
jcmd:多功能命令 在jdk1.7以后,新增了一个请打的命令行工具jcmd,它可以实现上面除了jstat外所有命令的功能。 jmcd命令格式:
jcmd <pid | main class> <command ... | PerfCounter.print | -f file>
jmcd工具主要选项: help 打印帮助信息,示例:jcmd help [] ManagementAgent.stop 停止JMX Agent ManagementAgent.start_local 开启本地JMX Agent ManagementAgent.start 开启JMX Agent Thread.print 参数-l打印java.util.concurrent锁信息,相当于:jstack PerfCounter.print 相当于:jstat -J-Djstat.showUnsupported=true -snap GC.class_histogram 相当于:jmap -histo GC.heap_dump 相当于:jmap -dump:format=b,file=xxx.bin GC.run_finalization 相当于:System.runFinalization() GC.run 相当于:System.gc() VM.uptime 参数-date打印当前时间,VM启动到现在的时候,以秒为单位显示 VM.flags 参数-all输出全部,相当于:jinfo -flags , jinfo -flag VM.system_properties 相当于:jinfo -sysprops VM.command_line 相当于:jinfo -sysprops grep command VM.version 相当于:jinfo -sysprops grep version
可视化性能监控工具Visual VM
Visual VM是一个功能强大的多合一故障诊断和性能监控可视化工具,它集成了多种性能统计工具的功能,使用Visual VM可以代替jstat、jmap、jhat、jstack,甚至代替JConsole。在JDK6升级到JDK7以后,Visual VM便作为JDK的一部分发布,即它完全免费。 Viusal VM也可以作为独立的软件安装,读者可以在http://visualvm.java.net下载,然后安装Visual VM的最新版本。 Visual VM的一大特点是支持插件扩展,并且插件安装非常方便。我们既可以通过离线下载插件文件*.nbm,然后在Plugin对话框的已下载页面添加已下载的插件,也可以在可用插件页面下,在线安装插件.
Visual VM连接应用程序
Visual VM支持多种方式连接应用程序,最常用的就是本地连接。只要本地计算机内有Java应用程序正在执行,在Visual VM的Local节点下,就会出现这些应用程序。 双击应用程序或者使用鼠标右键打开应用程序,就能够监控应用程序运行,如图6.32所示。由于Visual VM本身也是Java应用程序,所以自身也在列表内。 除了本地连接,Visual VM也支持远程JMX连接。Java应用程序可以通过以下参数打开JMX端口:
监控应用程序概况
通过Visual VM,可以查看应用程序的基本概况,比如进程ID、Main Class、启动参数等 单击Tab页面上的监视页面,即可监控应用程序CPU、堆、永久区、类加载和线程数的总体情况。通过页面上的“执行垃圾回收”和“堆 Dump”按钮还可以手工执行Full GC和生成堆快照 注意: Visual VM将CPU使用情况、堆信息、永久区信息、线程及类加载情况做了可视化的展示,方便开发人员查看。
Thread Dump和分析
Visual VM的线程页面可以提供详细的线程信息。单击右上角的“线程 Dump”按钮可以导出当前所有线程的堆栈信息(相当于使用jstack命令)。 如果Visual VM在当前程序中找到死锁,则会以十分显眼的方式在线程页面中给予提示 注意: Visual VM的Thread页面提供了详细的线程信息,还会进行自动的死锁监测,一旦发现存在死锁便会提示用户。
性能分析
Visual VM有两个采样器,在Sampler页面显示了CPU和内存两个性能采样器,用于实时监控程序信息。CPU采样器可以将CPU占用时间定位到方法,内存采样器可以查看当前程序的堆信息。 通过Visual VM的采样功能,可以找到该程序中占用CPU时间最长的方法,如图6.40所示。可以看到HoldCPUTask.run()方法占用了大量的CPU时间,而LazyTask.run()方法就非常空闲。通常,可以根据这个功能,简单地定位到系统中最消耗资源的方法,并加以改进。
内存快照分析
内存快照分析,在顶部的Tab页中,提供了4个基本功能页:概要、类、实例数和OQL控制台。下面分别介绍它们。 (1)概要页面展示了当前内存的整体信息,包括内存大小、实例总数、类总数等。 (2)在类页面中,以类为索引,显示了每个类的实例数和占用空间。在类页面中,还可以对两个不同的内存快照文件进行比较,这个功能可以帮助开发者快速分析同一应用程序在运行的不同时刻,内存数据产生的变化