欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM(03):JVM常见内存监控、性能调优等命令详解

程序员文章站 2022-06-07 07:54:03
...

JVM(03):JVM常见内存监控、性能调优等命令详解

1、jps:JVM Process Status Tool:

    显示指定系统内所有的HotSpot虚拟机进程。

1.1、命令格式: 

    jps    [ options ] [ hostid ]
    比如:jps

JVM(03):JVM常见内存监控、性能调优等命令详解

1.2、options 选项说明

1.2.1、-q:只输出LVMID,省略主类的名称

JVM(03):JVM常见内存监控、性能调优等命令详解

1.2.2、-m:输出虚拟机进程启动时传递给主类main()函数的参数

JVM(03):JVM常见内存监控、性能调优等命令详解

1.2.3、-l:输出主类的全名,如果进程执行的是jar包,输出jar包路径

JVM(03):JVM常见内存监控、性能调优等命令详解

1.2.4、-v:输出虚拟机进程启动时的JVM参数

JVM(03):JVM常见内存监控、性能调优等命令详解

2、jstat:虚拟机统计信息监视工具

    jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机的类装载、内存、垃圾收集、JIT编译等运行数据。

2.1、jstat命令格式

    jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

  • opetion:操作类型,可jstat -options 查看可操作的类型
  • vmid:vimd和lvmid:如果是本地虚拟机进程,VMID和LVMID一致。如果是远程虚拟机进程,VMID的格式为:
        [ protool: ] [ // ] lmid [ @hostname [ :port ] /servername ]
        参数interval和count查询间隔和次数,如果省略该参数,则表示只查询一次。
        例如:jstat -gc 2764 250 20    表示每隔250毫秒查询一下内存收集情况,一共查询20次。
  • lines:显示开头num行记录
  • interval:间隔毫米数
  • count:查询次数

2.2、option参数

    可通过如下命令查看option选项:jstat -options
  • -class:监视类装载、卸载数量、总空间及类装载所耗费的时间。
  • -gc:监视Java堆情况,包括Eden区、2个surivivor区、老年代、永久代等容量、已用空间、GC时间合计等信息。
  • -gccapacity:与gc基本相同,输出主要关注Java堆各个区域使用到的最大和最小空间。
  • -gcutil:与gc基本相同,输出主要关注已使用空间占总空间的百分比。
  • -gccause:与gc基本一样,会额外输出导致上一次gc的原因。
  • -gcnew:监视新生代gc状况。
  • -gcnewcapacity:与gcnew一样,输出主要关注使用到的最大和最小空间。
  • -gcold:监视老年代。
  • -gcoldcapacity:与gcold一样,输出主要关注使用到的最大和最小空间。
  • -gcpermcapacity:输出永久代使用到的最大和最小空间。
  • -compiler:输出JIT编译器编译过的方法、耗时等信息。
  • -printcompilation:输出已经被JIT编译的方法。

2.3、命令示例

2.3.1、查看gc统计时间:

JVM(03):JVM常见内存监控、性能调优等命令详解
  • S0C:第一个幸存区的大小 
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:Eden区的大小
  • EU:Eden区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间,单位sFGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间,单位s
  • GCT:垃圾回收消耗总时间,单位s 

2.3.2、查看堆统计信息

JVM(03):JVM常见内存监控、性能调优等命令详解
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • EC:Eden区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代gc次数
  • FGC:老年代GC次数

2.3.3、新生代垃圾回收统计

JVM(03):JVM常见内存监控、性能调优等命令详解

  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间

2.3.4、新生代内存统计

JVM(03):JVM常见内存监控、性能调优等命令详解

  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:最大幸存1区大小
  • S0C:当前幸存1区大小
  • S1CMX:最大幸存2区大小
  • S1C:当前幸存2区大小
  • ECMX:最大伊甸园区大小
  • EC:当前伊甸园区大小
  • YGC:年轻代垃圾回收次数FGC:老年代回收次数

2.3.5、老年代垃圾回收统计

JVM(03):JVM常见内存监控、性能调优等命令详解

  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.3.6、老年代内存统计

JVM(03):JVM常见内存监控、性能调优等命令详解

  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间
2.3.7、元数据空间统计

JVM(03):JVM常见内存监控、性能调优等命令详解

  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

2.3.8、已使用空间占总空间的百分比

JVM(03):JVM常见内存监控、性能调优等命令详解

  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:年轻代垃圾回收次数
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间

3、jinfo:Java配置信息工具

    jinfo(Configuration Info for Java)可以实时的查看和调整虚拟机的各项参数。使用jps -v可以查看虚拟机启动时显式指定的参数列表。

3.1、用法

jinfo指令格式

  • jinfo [option] <pid>:查询正在运行的进程的jvm参数
  • jinfo [option] <executable <core>:查询核心进程的相关信息
  • jinfo [option] [aaa@qq.com]<remote server IP or hostname>:查询远程虚拟机的相关信息

Option参数说明:

  • -flag <name>:显示指定参数的值
  • -flag [+|-]<name>:使用或禁止JVM某个参数
  • -flag <name>=<value>:设置JVM某个参数的值
  • -flags:显示应用JVM所有参数信息
  • -sysprops:显示JVM系统参数信息
  • <no option>:显示JVM系统级别和应用级别信息
  • -h | -help:显示该指令的帮助操作信息

3.2、显示JVM所有的参数

JVM(03):JVM常见内存监控、性能调优等命令详解

3.3、查看某个JVM参数的值,比如:查看MaxNewSize的值

JVM(03):JVM常见内存监控、性能调优等命令详解

3.4、查看Java系统参数

JVM(03):JVM常见内存监控、性能调优等命令详解
JVM(03):JVM常见内存监控、性能调优等命令详解
JVM(03):JVM常见内存监控、性能调优等命令详解

4、jstack:java堆栈信息查看工具

    主要用来生成虚拟机当前时刻的线程快照,也就是当前虚拟机内每一条线程正在执行的方法堆栈集合信息。主要用来分析线程出现长时间停顿的原因,比如线程间死锁、死循环、请求外部资源长时间等待等问题。

4.1、用法

    jstack [ option ] vmid

4.2、option 参数说明

  • -F:当请求不被响应时,强制输出线程堆栈信息
  • -m:如果调用本地方法,则显示C/C++堆栈信息
  • -l:处堆栈外,显示关于锁的附加信息
  • -h:输出帮助信息

4.3、命令参数使用样例

4.3.1、-l:显示关于锁的附加信息

JVM(03):JVM常见内存监控、性能调优等命令详解

4.3.2、-m:显示堆栈信息,包括C/C++

JVM(03):JVM常见内存监控、性能调优等命令详解

5、jmap:Java内存映像工具

    该命令主要用于生成堆转储快照,一般称为heapdump或者dump文件。其他获取堆转储快照的方式相对暴力,有如下几种:
  • 配置-XX:HeapDumpOnOutMemoryError:让虚拟机在OOM异常后自动生成dump快照。
  • 配置-XX:HeapDumpOnCtrlBreak:可以使用Ctrl+Break让虚拟机生成dump快照。
  • Linux系统下通过kill -3发出进程退出信号来恐吓虚拟机,也能生成dump文件。

5.1、jmap命令操作

jmap格式
  • jmap [option] <pid>:查询正在运行的进程的jvm内存快照
  • jmap [option] <executable <core>:查询核心进程jvm内存快照
  • jmap [option] [aaa@qq.com]<remote server IP or hostname>:查询远程虚拟机的内存快照信息

5.2、option指令格式:

  • -dump:生成java堆转储快照。
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。
  • -heap:显示java堆详细信息。比如:使用哪种收集器、参数配置、分代情况等。
  • -histo:显示堆中的统计信息,包括类、实例数量、合计容量
  • -F:当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。

5.3、操作指令示例

5.3.1、-dump:生成java堆转储快照。例如

         jmap -dump:live,format=b,file=open.log 968    获取对中存活对象的快照
         jmap -dump:format=b,file=open.log 968    获取堆中所有对象的快照

JVM(03):JVM常见内存监控、性能调优等命令详解

5.3.2、-finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。

JVM(03):JVM常见内存监控、性能调优等命令详解

    当前系统执行finalization:0, 数量为0。

5.3.3、-heap:显示java堆详细信息。比如:使用哪种收集器、参数配置、分代情况等。

JVM(03):JVM常见内存监控、性能调优等命令详解

5.3.4、-histo:显示堆中的统计信息,包括类、实例数量、合计容量

    jmap -histo:live pid:显示存活的对象的统计信息
    jmap -histo pid:显示所有对象的统计信息,包括最近被回收的快照

JVM(03):JVM常见内存监控、性能调优等命令详解

  •             num:序号
  •             instances:实际数量
  •             bytes:占用空间大小
  •             class name:详细类名、对象名等信息。

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

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

6.1、命令格式

Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

        -J<flag>          Pass <flag> directly to the runtime system. For
                          example, -J-mx512m to use a maximum heap size of 512MB
        -stack false:     Turn off tracking object allocation call stack.
        -refs false:      Turn off tracking of references to objects
        -port <port>:     Set the port for the HTTP server.  Defaults to 7000
        -exclude <file>:  Specify a file that lists data members that should
                          be excluded from the reachableFrom query.
        -baseline <file>: Specify a baseline object dump.  Objects in
                          both heap dumps with the same ID and same class will
                          be marked as not being "new".
        -debug <int>:     Set debug level.
                            0:  No debug output
                            1:  Debug hprof file parsing
                            2:  Debug hprof file parsing, no server
        -version          Report version number
        -h|-help          Print this help and exit
        <file>            The file to read

6.2、查看生成的堆快照文件

JVM(03):JVM常见内存监控、性能调优等命令详解

JVM(03):JVM常见内存监控、性能调优等命令详解