JVM性能监控工具

命令工具

jps 进程状况工具

命令格式

jps [options] [hostid]

options参数

-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数

示例

[root@iZ2zeakk81np7c2f2tj9mjZ bin]# jps -l -m
26086 sun.tools.jps.Jps -l -m
20249 org.apache.catalina.startup.Bootstrap start

jstat 统计信息监控工具

用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程[虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

命令格式

jstat [option] LVMID [interval] [count]

参数说明

[option] : 操作参数
LVMID : 本地虚拟机进程ID
[interval] : 查询时间间隔 ms
[count] : 查询次数
如果interval和count两个参数省略,则只查询一次

option参数

选项作用
-class监视类加载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况、包括Eden区、2个Survivor区、老年代等容量,已用空间,垃圾收集时间等信息。
-gccapacity监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但会输出额外输出导致上一次垃圾收集产生的原因
-gcnew监视新生代垃圾收集状况
-gcnewcapacity监视内容与 -gcnew 基本相同,输出主要关注使用的最大、最小空间
-gcold监视老年代垃圾收集情况
gcoldcapacity监视内容与 -gcold 基本相同,输出主要关注使用的最大、最小空间
-gcpermcapacity输出永久代使用的最大、最小空间
-compiler输出即时编译器编译过的方法、耗时等信息
-printcompilation输出已经被即时编译的方法

示例

[root@iZ2zeakk81np7c2f2tj9mjZ /]# jstat -gc 20249
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3392.0 3392.0 1467.0  0.0   27264.0   4054.9   68008.0    49881.8   76928.0 73071.4 9600.0 8899.6   2190   13.887   6      0.814   14.701

变量解释
S0C:年轻代中第一个survivor(幸存区)的容量 (kb)
S1C:年轻代中第二个survivor(幸存区)的容量 (kb)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (kb)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (kb)
EC:年轻代中Eden(伊甸园)的容量 (kb)
EU:年轻代中Eden(伊甸园)目前已使用空间 (kb)
OC:Old代的容量 (kb)
OU:Old代目前已使用空间 (kb)
PC:Perm(持久代)的容量 (kb)
PU:Perm(持久代)目前已使用空间 (kb)
CCS:压缩使用比例
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (kb)
NGCMX:年轻代(young)的最大容量 (kb)
NGC:年轻代(young)中当前的容量 (kb)
OGCMN:old代中初始化(最小)的大小 (kb)
OGCMX:old代的最大容量 (kb)
OGC:old代当前新生成的容量 (kb)
PGCMN:perm代中初始化(最小)的大小 (kb)
PGCMX:perm代的最大容量 (kb)
PGC:perm代当前新生成的容量 (kb)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
M:元数据区使用比例
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (kb)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (kb)
ECMX:年轻代中Eden(伊甸园)的最大容量 (kb)
DSS:当前需要survivor(幸存区)的容量 (kb)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制

jinfo 配置信息工具

作用是实时查看和调整虚拟机各项参数,在运行期有修改部分参数值的能力(可以使用-flag[+|-]name或者-flag name=value在运行期修改一部分运行期可写的虚拟机参数值)
JDK9中集成到了JHSDB

命令格式

jinfo [ option ] pid
[root@iZ2zeakk81np7c2f2tj9mjZ bin]# jinfo -help
Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

从上往下依次

1、用于打印虚拟机标记参数的值,name表示虚拟机标记参数的名称。
2、用于开启或关闭虚拟机标记参数。+表示开启,-表示关闭。
3、用于设置虚拟机标记参数,但并不是每个参数都可以被动态修改的。
4、打印虚拟机参数。什么是虚拟机参数呢?如-XX:NewSize,-XX:OldSize等就是虚拟机参数。
5、打印系统参数,等于System.getProperties()

示例

[root@iZ2zeakk81np7c2f2tj9mjZ bin]# jinfo -flags 20249
Attaching to process ID 20249, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=482344960 -XX:MaxNewSize=160759808 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=10485760 -XX:OldSize=20971520 -XX:-PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
Command line:  -Djava.util.logging.config.file=/opt/tomcat/apache-tomcat-9.0.35/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/opt/tomcat/apache-tomcat-9.0.35 -Dcatalina.home=/opt/tomcat/apache-tomcat-9.0.35 -Djava.io.tmpdir=/opt/tomcat/apache-tomcat-9.0.35/temp

jmap 内存映像工具

jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
JDK9中集成到了JHSDB

命令格式

jmap [option] vmid

option参数

参数作用
-dump生成堆转储快照
-finalizerinfo显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效
-heap显示Java堆详细信息,如使用哪种回收器、参数配置、分代情况等,只在Linux/Solaris平台下有效
-histo显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat以ClassLoader为统计口径显示永久代内存。只在Linux/Solaris平台下有效
-F当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效

示例

[root@iZ2zeakk81np7c2f2tj9mjZ /]# jmap -heap 20249
Attaching to process ID 20249, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 482344960 (460.0MB)
   NewSize                  = 10485760 (10.0MB)
   MaxNewSize               = 160759808 (153.3125MB)
   OldSize                  = 20971520 (20.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 31391744 (29.9375MB)
   used     = 11372008 (10.845191955566406MB)
   free     = 20019736 (19.092308044433594MB)
   36.226110916296975% used
Eden Space:
   capacity = 27918336 (26.625MB)
   used     = 9893080 (9.434776306152344MB)
   free     = 18025256 (17.190223693847656MB)
   35.435779553623824% used
From Space:
   capacity = 3473408 (3.3125MB)
   used     = 1478928 (1.4104156494140625MB)
   free     = 1994480 (1.9020843505859375MB)
   42.57858564268868% used
To Space:
   capacity = 3473408 (3.3125MB)
   used     = 0 (0.0MB)
   free     = 3473408 (3.3125MB)
   0.0% used
tenured generation:
   capacity = 69640192 (66.4140625MB)
   used     = 52259472 (49.83851623535156MB)
   free     = 17380720 (16.575546264648438MB)
   75.04211361163392% used

31869 interned Strings occupying 3335592 bytes

jhat 虚拟机堆转储快照分析工具

JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。不过实事求是地说,在实际工作中,除非手上真的没别的工具可用,否则多数人是不会直接使用jhat命令来分析堆转储快照文件的,主要原因有两个方面。一是一般不会在部署应用程序的服务器上直接分析堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器上进行分析,因为分析工作是一个耗时而且极为耗费硬件资源的过程,既然都要在其他机器上进行,没有必要再受命令行工具的限制了。另外一个原因是jhat的分析功能相对来说比较简陋。
JDK9中被JHSDB代替

jstack Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件}。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
JDK9中集成到了JHSDB中

命令格式

jstack [ option ] vmid

option参数

参数作用
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用到本地方法的话,可以显示C/C++的堆栈

示例


// 死锁
public class DeadLockDemo {
    private static Object resource1 = new Object();
    private static Object resource2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
           synchronized (resource1) {
               System.out.println(Thread.currentThread() + " get resource1");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println(Thread.currentThread() + " waiting get resource2");
               synchronized (resource2) {
                   System.out.println(Thread.currentThread() + " get resource2");
               }
           }
        },"线程 -1").start();

        new Thread(() -> {
            synchronized (resource2) {  // 改为synchronized (resource1)  即可避免死锁
                System.out.println(Thread.currentThread() + " get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + " waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + " get resource1");
                }
            }
        },"线程 -2").start();
    }
}
C:\Users\SC>jstack -F 1496
Attaching to process ID 1496, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
Deadlock Detection:

Found one Java-level deadlock:
=============================

"线程 -1":
  waiting to lock Monitor@0x0000000018833268 (Object@0x00000000d6689d18, a java/lang/Object),
  which is held by "线程 -2"
"线程 -2":
  waiting to lock Monitor@0x0000000018830a88 (Object@0x00000000d6689d08, a java/lang/Object),
  which is held by "线程 -1"

Found a total of 1 deadlock.
...

可视化工具

JConsole Java监视与管理控制台

jvisualvm 多合-故障处理工具

VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,JDK/bin目录打开jvisualvm,第一次打开没有加载任何插件,只有最基本的监视、线程面板功能。可在“工具–插件”中安装插件。其中也包括了JConsole里面的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值