参数

作者: asdf____ | 来源:发表于2020-04-13 11:06 被阅读0次

    一、jps

    jps(Java Virtual Machine Process Status),JVM 进程状态命令,主要用于获取 JVM 进程的相关信息。
    // 命令格式和参数
    $ usage: jps [-help]
           jps [-q] [-mlvV] [<hostid>]
    
    Definitions:
        <hostid>:      <hostname>[:<port>]
    
    选项说明:
    q: 只输出lvmid (jvm进程的id标识)
    m: 输出传递给main()方法的参数,在嵌入式jvm上可能是null
    l: 输出应用程序main主类的全限定完整类名 或者 应用程序的jar文件的完整路径名 
    v: 输出传递给JVM的参数,包括JVM启动时显示指定的JVM参数
    V: 隐藏输出传递给JVM的参数
    hostid: 主机名:端口号
    
    示例:
    $ jps
    1251
    10724 Launcher
    11415 Jps
    11338 Bootstrap
    
    $ jps -q
    1251
    10724
    11338
    11423
    
    $ jps -m
    1251
    10724 Launcher/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/lib/nanoxml-2.2.3.jar:/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/lib/commons-logging-1.2.jar:/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/lib/jps-builders.jar:/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/lib/forms_rt.jar:/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/lib/javac2.jar:/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/lib/httpclient-4.5.2.jar:/private/var/folders/
    11338 Bootstrapstart
    11439 Jps-m
    
    $ jps -l
    1251
    10724 org.jetbrains.jps.cmdline.Launcher
    11431 sun.tools.jps.Jps
    11338 org.apache.catalina.startup.Bootstrap
    
    $ jps -v
    1251 -Xms128m-Xmx750m-XX:ReservedCodeCacheSize=240m-XX:+UseCompressedOops-Dfile.encoding=UTF-8-XX:+UseConcMarkSweepGC-XX:SoftRefLRUPolicyMSPerMB=50-ea-Dsun.io.useCanonCaches=false-Djava.net.preferIPv4Stack=true-XX:+HeapDumpOnOutOfMemoryError-XX:-OmitStackTraceInFastThrow-Xverify:none-XX:ErrorFile=/Users/xxx/java_error_in_idea_%p.log-XX:HeapDumpPath=/Users/xxx/java_error_in_idea.hprof-Djb.vmOptionsFile=/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents/bin/idea.vmoptions-Didea.java.redist=jdk-bundled-Didea.home.path=/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents-Didea.executable=idea-Didea.paths.selector=IntelliJIdea2018.1
    10724 Launcher-Xmx700m-Djava.awt.headless=true-Djava.endorsed.dirs=""-Djdt.compiler.useSingleThread=true-Dpreload.project.path=/Users/xxx/project-Dpreload.config.path=/Users/xxx/Library/Preferences/IntelliJIdea2018.1/options-Dcompile.parallel=false-Drebuild.on.dependency.change=true-Djava.net.preferIPv4Stack=true-Dio.netty.initialSeedUniquifier=675819434505459381-Dfile.encoding=UTF-8-Duser.language=zh-Duser.country=CN-Didea.paths.selector=IntelliJIdea2018.1-Didea.home.path=/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/IntelliJIDEA.app/Contents-Didea.config.path=/Users/xxx/Library/Preferences/IntelliJIdea2018.1-Didea.plugins.path=/Users/xxx/Library/ApplicationSupport/IntelliJIdea2018.1-Djps.log.dir=/Users/xxx/Library/Logs/IntelliJIdea2018.1/build-log-Djps.fallback.jdk.home=/private/var/folders/4x/km4q0ttj42gbkc2mhx7687600000gn/T/AppTranslocation/5C1DCDD8-891E-468E-85E6-AE16BE8056CD/d/Intel
    11447 Jps-Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home-Xms8m
    11338 Bootstrap-Djava.util.logging.config.file=/Users/xxx/Library/Caches/IntelliJIdea2018.1/tomcat/Unnamed_project/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Dvisualvm.id=53116045042191-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port=1099-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Djava.rmi.server.hostname=127.0.0.1-Djdk.tls.ephemeralDHKeySize=2048-Djava.protocol.handler.pkgs=org.apache.catalina.webresources-Dignore.endorsed.dirs=-Dcatalina.base=/Users/xxx/Library/Caches/IntelliJIdea2018.1/tomcat/Unnamed_project-Dcatalina.home=/usr/local/java/apache-tomcat-8.0.50-Djava.io.tmpdir=/usr/local/java/apache-tomcat-8.0.50/temp
    

    二、jstat

    jstat(Java Virtual Machine Statistics Monitoring), JVM 运行时状态统计信息监控命令,用于监控和查看类加载、JIT编译、各内存区域分配以及使用、垃圾收集等运行时数据。
    // 命令格式和参数
    $ jstat-help
    Usage: jstat -help|-options
           jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    Definitions:
      <option>      An option reported by the -options option
      <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                         <lvmid>[@<hostname>[:<port>]]
                    Where <lvmid> is the local vm identifier for the target
                    Java virtual machine, typically a process id; <hostname> is
                    the name of the host running the target Java virtual machine;
                    and <port> is the port number for the rmiregistry on the
                    target host. See the jvmstat documentation for a more complete
                    description of the Virtual Machine Identifier.
      <lines>       Number of samples between header lines.
      <interval>    Sampling interval. The following forms are allowed:
                        <n>["ms"|"s"] // 输出时间间隔,默认ms,可以指定单位:2000,2000ms, 2s
                    Where <n> is an integer and the suffix specifies the units as
                    milliseconds("ms") or seconds("s"). The default units are "ms".
      <count>       Number of samples to take before terminating. // 输出次数
      -J<flag>      Pass <flag> directly to the runtime system.
    
    $ jstat -options
    -class: 类加载的行为统计
    -compiler: HotSpot JIT (Just-in-Time) 编译器行为统计
    -gc: 垃圾回收堆的行为统计
    -gccapacity: 各个垃圾回收代容量(young,old,perm)和它们相应的空间统计。
    -gccause: 垃圾收集统计概述(同-gcutil),并输出上一次和本次GC事件发生的原因
    -gcpermcapacity: 永久代行为统计 (说明:jkd8不存在这个选项,已移除永久代)
    -gcmetacapacity: 元空间 (说明:jkd8存在这个选项)
    -gcnew: 新生代行为统计
    -gcnewcapacity: 新生代与其相应的内存空间的统计
    -gcold: 老年代和永久代行为统计
    -gcoldcapacity: 老年代行为统计
    -gcutil: 垃圾回收统计概述(以百分比描述)
    -printcompilationHotSpot: 编译方法统计
    
    示例:(jvm进程pid为12772)
    $ jstat -class 12772
    Loaded Bytes Unloaded Bytes Time
    33776358.000.01.20
    输出参数说明:
    Loaded:加载的class文件数量
    Bytes:加载的class文件所占用空间总大小(KB)
    Unloaded:未加载class文件的数量
    Bytes:未加载class文件所占用空间总大小(KB)
    Time:加载class文件的总时间(ms)
    
    $ jstat -compiler 12772
    Compiled Failed Invalid   Time   FailedType  FailedMethod      
        1219      0       0   2.58            1  org/apache/tomcat/util/IntrospectionUtilssetProperty
    输出参数说明:
    Compiled:编译数量
    Failed:编译失败数量
    Invalid:无效数量
    Time:编译耗时
    FailedType:失败类型
    FailedMethod:失败方法的全限定名
    
    $ jstat -gc 12772
    S0C      S1C      S0U   S1U     EC       EU        OC        OU      MC       MU       CCSC    CCSU    YGC  YGCT   FGC  FGCT    GCT
    10752.0  10752.0  0.0   5619.5  65536.0  39578.9   175104.0  16.0    15872.0  15290.4  2048.0  1848.2  1    0.009  0    0.000   0.009
    输出参数说明:容量大小单位为(KB)
    S0C:Survivor0的总容量(与下面gccapacity输出的当前容量实际上是一样的)
    S1C:Survivor1的总容量
    S0U:Survivor0的已使用容量
    S1U:Survivor1的已使用容量
    EC:Eden区的总容量
    EU:Eden区的已使用容量
    OC:OldGeneration的总容量
    OU:OldGeneration的已使用容量
    PC:PermGeneration的总容量(jdk7及之前版本存在)
    PU:PermGeneration的已使用容量(jdk7及之前版本存在)
    MC:MetaSpace的总容量(jdk8版本存在)
    MU:MetaSpace的已使用容量(jdk8版本存在)
    CCSC:压缩类空间的总容量
    CCSU:压缩类空间的已使用容量
    YGC:younggc次数
    YGCT:younggc次数消耗总时间
    FGC:fullgc次数
    FGCT:fulgc消耗总时间
    GCT:gc消耗总时间(YGCT+FGCT)
    
    $ jstat -gccapacity 12772
    NGCMN    NGCMX     NGC      S0C      S1C      EC       OGCMN     OGCMX     OGC      OC        MCMN  MCMX       MC       CCSMN  CCSMX      CCSC    YGC  FGC
    87040.0  238592.0  87040.0  10752.0  10752.0  65536.0  175104.0  478208.0  175104.0 175104.0  0.0   1062912.0  15872.0  0.0    1048576.0  2048.0  1    0
    输出参数说明:容量大小单位为(KB)
    NGCMN:NewGeneration的最小容量
    NGCMX:NewGeneration的最大容量
    NGC:NewGeneration的当前容量
    S0C:Survivor0的当前容量
    S1C:Survivor1的当前容量
    EC:Eden区的当前容量
    OGCMN:OldGeneration的最小容量
    OGCMX:OldGeneration的最大容量
    OGC:OldGeneration的当容量
    OC:OldGeneration的当前容量,同OGC
    PGCMN:PermGeneration的最小容量
    PGCMX:PermGeneration的最大容量
    PGC:PermGeneration的当前容量
    PC:PermGeneration的当前容量,同PGC
    MCMN:MetaSpace的最小容量
    MCMX:MetaSpace的最大容量
    MC:MetaSpace的当前容量
    CCSMN:压缩类空间最小容量
    CCSMX:压缩类空间最大容量
    CCSC:压缩类空间当前容量
    YGC:younggc次数
    FGC:fullgc次数
    
    $ jstat -gccause 12772
    S0    S1     E      O     M      CCS    YGC  YGCT   FGC  FGCT   GCT    LGCC                GCC
    0.00  52.26  60.39  0.01  96.34  90.25  1    0.009  0    0.000  0.009  Allocation Failure  No GC
    输出参数说明:输出的使用情况是百分比
    S0:Survivor0的已使用大小
    S1:Survivor1的已使用大小
    E:Eden区的已使用大小
    O:老年代(Old)的已使用大小
    P:永久代(Perm)的已使用大小(jdk7及之前版本存在)
    M:元空间(MetaSpace)的已使用大小(jdk8版本存在)
    CCS:压缩类空间的已使用大小(jdk8版本存在)
    YGC:younggc次数
    YGCT:younggc次数消耗总时间
    FGC:fullgc次数
    FGCT:fulgc消耗总时间
    GCT:gc消耗总时间(YGCT+FGCT)
    LGCC:上一次gc的原因
    GCC:本次gc的原因
    
    $ jstat -gcmetacapacity 12772
    MCMN  MCMX       MC       CCSMN  CCSMX      CCSC    YGC  FGC  FGCT   GCT
    0.0   1062912.0  15872.0  0.0    1048576.0  2048.0  1    0    0.000  0.009
    输出参数说明:容量大小单位为(KB)
    MCMN:MetaSpace的最小容量
    MCMX:MetaSpace的最大容量
    MC:MetaSpace的当前容量
    CCSMN:压缩类空间最小容量
    CCSMX:压缩类空间最大容量
    CCSC:压缩类空间当前容量
    YGC:younggc次数
    YGCT:younggc次数消耗总时间
    FGC:fullgc次数
    FGCT:fulgc消耗总时间
    GCT:gc消耗总时间(YGCT+FGCT)
    
    $ jstat -gcnew 12772
    S0C      S1C      S0U   S1U     TT   MTT  DSS      EC       EU       YGC  YGCT
    10752.0  10752.0  0.0   5619.5  7    15   10752.0  65536.0  39578.9  1    0.009
    输出参数说明:容量大小单位为(KB)
    S0C:Survivor0的当前容量
    S1C:Survivor1的当前容量
    S0U:Survivor0的已使用容量
    S1U:Survivor1的已使用容量
    TT:对象在新生代存活的次数,即Tenuringthreshold(提升阈值)
    MTT:对象在新生代存活的最大次数
    DSS:DesiredSurviviorSize,Survivior的期望大小
    EC:Eden区的当前容量
    EU:Eden区的已使用容量
    YGC:younggc次数
    YGCT:younggc次数消耗总时间
    
    $ jstat -gcnewcapacity 12772
    NGCMN    NGCMX    NGC      S0CMX    S0C      S1CMX    S1C      ECMX      EC       YGC  FGC
    87040.0  238592.0 87040.0  79360.0  10752.0  79360.0  10752.0  237568.0  65536.0  1    0
    输出参数说明:容量大小单位为(KB)
    NGCMN:NewGeneration的最小容量
    NGCMX:NewGeneration的最大容量
    NGC:NewGeneration的当前容量
    S0CMX:Survivor0的最大容量
    S0C:Survivor0的当前容量
    S1CMX:Survivor1的最大容量
    S1C:Survivor1的当前容量
    ECMX:Eden区的最大容量
    EC:Eden区的当前容量
    YGC:younggc次数
    FGC:fullgc次数
    
    $ jstat -gcold 12772
    MC       MU       CCSC    CCSU    OC        OU    YGC  FGC  FGCT   GCT
    15872.0  15290.4  2048.0  1848.2  175104.0  16.0  1    0    0.000  0.009
    输出参数说明:容量大小单位为(KB)
    PC:永久代(Perm)的当前容量(jdk7及之前版本存在)
    PU:永久代(Perm)的已使用容量(jdk7及之前版本存在)
    MC:元空间(MetaSpace)的当前容量(jdk8版本存在)
    MU:元空间(MetaSpace)的已使用容量(jdk8版本存在)
    CCSC:压缩类空间的当前容量
    CCSU:压缩类空间的已使用容量
    OC:OldGeneration的当前容量
    OU:OldGeneration的已使用容量
    YGC:younggc次数
    FGC:fullgc次数
    FGCT:fulgc消耗总时间
    GCT:gc消耗总时间(YGCT+FGCT)
    
    $ jstat -gcoldcapacity 12772
    OGCMN     OGCMX     OGC       OC        YGC  FGC  FGCT   GCT
    175104.0  478208.0  175104.0  175104.0  1    0    0.000  0.009
    输出参数说明:容量大小单位为(KB)
    OGCMN:OldGeneration的最小容量
    OGCMX:OldGeneration的最大容量
    OGC:OldGeneration的当容量
    OC:OldGeneration的当前容量,同OGC
    YGC:younggc次数
    FGC:fullgc次数
    FGCT:fulgc消耗总时间
    GCT:gc消耗总时间(YGCT+FGCT)
    
    $ jstat -gcutil 12772
    S0   S1    E     O    M     CCS    YGC  YGCT   FGC  FGCT   GCT
    0.00 52.26 60.39 0.01 96.34 90.25  1    0.009  0    0.000  0.009
    输出参数说明:输出的使用情况是百分比
    S0:Survivor0的已使用大小
    S1:Survivor1的已使用大小
    E:Eden区的已使用大小
    O:老年代(Old)的已使用大小
    P:永久代(Perm)的已使用大小(jdk7及之前版本存在)
    M:元空间(MetaSpace)的已使用大小(jdk8版本存在)
    CCS:压缩类空间的已使用大小(jdk8版本存在)
    YGC:younggc次数
    YGCT:younggc次数消耗总时间
    FGC:fullgc次数
    FGCT:fulgc消耗总时间
    GCT:gc消耗总时间(YGCT+FGCT)
    
    $ jstat -printcompilation 12772
    Compiled  Size  Type  Method
        1252    34     1  sun/nio/ch/SelectorImplselect
    输出参数说明:
    Compiled:被执行的编译任务的数量,最近编译方法的数量
    Size:最近编译方法的字节码数量(字节数)
    Type:最近编译方法的编译类型
    Method:方法名标识
    

    三、jinfo

    jinfo(Java Virtual Machine Configuration Info),JVM 配置信息命令,主要用于实时查看和调整JVM配置参数。
    Usage:
        // [option]后面的参数含义和 jmap 的一致,参考 jmap 的注释
        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 // 输出指定的JVM参数名和参数值
        -flag [+|-]<name>    to enable or disable the named VM flag // +: 启用指定参数,-: 禁用指定参数,用于设置布尔类型的JVM参数
        -flag <name>=<value> to set the named VM flag to the given value // 设置指定JVM参数的值,用于数字/字符串类型的JVM参数
        -flags               to print VM flags // 只输出全部的JVM参数
        -sysprops            to print Java system properties // 只输出全部的系统属性
        <no option>          to print both of the above // 输出全部的JVM参数和系统属性
        -h | -help           to print this help message
    
    注意:并不是所有的JVM参数都支持动态修改,只有标记为manageable的参数才可以,修改前一定要先确认能不能修改,
    可以通过 
    
    示例:
    $ jinfo -flag MaxMetaspaceSize 33100
    -XX:MaxMetaspaceSize=18446744073709486080
    
    $ jinfo -flag +HeapDumpBeforeFullGC 33100
    
    $ jinfo -flag MaxHeapFreeRatio=80 33100
    
    $ jinfo -flags 33100
    Attaching to process ID 33100, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.231-b11
    Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpBeforeFullGC -XX:InitialHeapSize=268435456 -XX:MaxDirectMemorySize=20971520 -XX:MaxHeapFreeRatio=80 -XX:Ma
    xHeapSize=2147483648 -XX:MaxNewSize=715653120 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompr
    essedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
    Command line:  -XX:MaxDirectMemorySize=20M -Xmx2G -javaagent:D:\Study\idea\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=60059:D:\Study\idea\IntelliJ IDEA 2019.2.4\bin -D
    file.encoding=UTF-8
    
    注意:
    并不是所有参数都支持实时修改,只有标记为 manageable 的参数才支持实时修改,可以用 java -XX:+PrintFlagsInitial 或者
    java -XX:+PrintFlagsFinal -version 查看:
    $ java -XX:+PrintFlagsInitial | grep manageable
         intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
         intx CMSTriggerInterval                        = -1                                  {manageable}
         intx CMSWaitDuration                           = 2000                                {manageable}
         bool HeapDumpAfterFullGC                       = false                               {manageable}
         bool HeapDumpBeforeFullGC                      = false                               {manageable}
         bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
        ccstr HeapDumpPath                              =                                     {manageable}
        uintx MaxHeapFreeRatio                          = 70                                  {manageable}
        uintx MinHeapFreeRatio                          = 40                                  {manageable}
         bool PrintClassHistogram                       = false                               {manageable}
         bool PrintClassHistogramAfterFullGC            = false                               {manageable}
         bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
         bool PrintConcurrentLocks                      = false                               {manageable}
         bool PrintGC                                   = false                               {manageable}
         bool PrintGCDateStamps                         = false                               {manageable}
         bool PrintGCDetails                            = false                               {manageable}
         bool PrintGCID                                 = false                               {manageable}
         bool PrintGCTimeStamps                         = false                               {manageable}
    

    四、jmap

    jmap(Java Virtual Machine Memory Map):JVM 内存映像命令,主要用于生成堆转储快照。
    // 命令格式和参数
    $ jmap -help
    Usage:
        // 连接到正在运行的进程,pid: 目标进程的id
        jmap [option] <pid>
            (to connect to running process)
        // 连接到核心文件,executable:  产生core dump的java可执行程序,core: 将被打印信息的core dump文件
        jmap [option] <executable <core>
            (to connect to a core file)
        // 连接到远程的debug服务,server_id: 服务的唯一id,remote server IP or hostname: 远程debug服务的主机名或ip
        jmap [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    where <option> is one of:
        <none>               to print same info as Solaris pmap
        // 输出Java堆的详细汇总信息,包括使用的GC收集器,JVM初始化配置参数,以及当前堆内存的使用情况
        -heap                to print java heap summary
        // 输出堆的对象直方图统计信息,包括对象数、内存大小等;如果配置了live子选项,则会先触发一次full gc,然后只输出存活的对象
        -histo[:live]        to print histogram of java object heap; if the "live"
                             suboption is specified, only count live objects
         // 输出类加载器的智能统计信息,执行这个命令时会有个计算过程,输出所有类加载器的名称、各自加载的类的数量和大小、父类加载器、alive还是dead状态以及type
         -clstats             to print class loader statistics
         // 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
        -finalizerinfo       to print information on objects awaiting finalization
         // 生成当前的堆转储快照
        -dump:<dump-options> to dump java heap in hprof binary format
                             dump-options:
                               // 指定live会先触发一次full gc,然后只dump存活的对象,不指定则dump当前所有对象
                               live         dump only live objects; if not specified,
                                            all objects in the heap are dumped.
                               // 二进制格式
                               format=b     binary format
                               // dump到的文件名
                               file=<file>  dump heap to <file>
                               // 例子:以hprof二进制格式dump所有存活对象到heap.bin文件中。
                               Example: jmap -dump:live,format=b,file=heap.bin <pid>
        // 当指定的pid没有响应时,histo或dump强制输出,但该选项不支持live子选项
        -F                   force. Use with -dump:<dump-options> <pid> or -histo
                             to force a heap dump or histogram when <pid> does not
                             respond. The "live" suboption is not supported
                             in this mode.
        -h | -help           to print this help message
        -J<flag>             to pass <flag> directly to the runtime system
        // jdk7及之前版本会有这个option,用于输出永久代的类加载器的统计信息(永久代实现方法区),和jdk8的 clstats 选项作用一样   
        // -permstat 
        // 要特别注意  jmap -dump:live 以及 jmap -histo:live 都会触发 full gc,和 JVM 参数 -XX:+DisableExplicitGC 无关,它是禁用显式的 System.gc() 的
    

    五、jhat

    jhat(Java Virtual Machine Heap Analysis Tool),JVM 堆分析工具命令,主要用于分析 jmap 生成的堆转储快照。
    jhat
    ERROR: No arguments supplied
    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
    
    For a dump file that contains multiple heap dumps,
    you may specify which dump in the file
    by appending "#<number>" to the file name, i.e. "foo.hprof#3".
    
    All boolean options default to "true"
    
    注意:
    jhat 内置了一个微型的 HTTP/Web 服务器,生成堆转储快照的分析结果后,可以直接在浏览器中查看。
    不过在实际工作中基本上不会用 jhat 来分析 dump 文件的,因为有更更强大、更专业的分析工具,比如常用的MAT。
    

    六、jstack

    jstack(Java Virtual Machine Stack Trace),JVM 线程堆栈跟踪命令,主要用于生成 JVM 进程的线程堆栈,也就是每个线程的方法调用栈信息,也称为线程快照。
    Usage:
        jstack [-l] <pid>
            (to connect to running process)
        jstack -F [-m] [-l] <pid>
            (to connect to a hung process)
        jstack [-m] [-l] <executable> <core>
            (to connect to a core file)
        jstack [-m] [-l] [server_id@]<remote server IP or hostname>
            (to connect to a remote debug server)
    
    Options:
        -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung) // 当 pid 进程没响应时,强制输出线程堆栈信息
        -m  to print both java and native frames (mixed mode) // 同时输出 Java 方法 和 native 方法的堆栈信息
        -l  long listing. Prints additional information about locks // 除了输出线程堆栈外,还会输出锁的附加信息
        -h or -help to print this help message
    
    $ jstack 17304
    "pool-1-thread-1" #12 prio=5 os_prio=0 tid=0x0000000020542000 nid=0xad0 runnable [0x000000002131f000]
       java.lang.Thread.State: RUNNABLE
            at stack.JstackTest$Task.cal(JstackTest.java:29)
            - locked <0x000000076b7e5d90> (a java.lang.Object)
            at stack.JstackTest$Task.run(JstackTest.java:22)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    输出说明:按照输出顺序
    pool-1-thread-1: 线程名称
    daemon: 线程是否是守护线程,只有是守护线程时才输出
    prio: Java 中为线程设置的优先级
    os_prio: 对应的操作系统线程的优先级,由于并不是所有的操作系统都支持线程优先级,所以可能会出现都置为0的情况
    tid: Java中为这个线程设置的 id 值
    nid: native id,对应的操作系统线程的 id 值,每一个Java 线程都有一个对应的操作系统线程
    操作系统线程状态:这里是系统的线程状态,有多种情况
    [xxxxxx]: 线程堆栈调用的起始内存地址
    java.lang.Thread.State:Java 线程状态
    线程调用栈信息:当前线程调用的详细堆栈信息
    
    从操作系统状态开始,存在几种可能的情况,下面分别分析。
    
    情况1:runnable [xxxxxx]:当前操作系统线程正在执行,对应 Java 线程处于 RUANNBLE 状态
    "pool-1-thread-1" #12 prio=5 os_prio=0 tid=0x0000000020542000 nid=0xad0 runnable [0x000000002131f000]
       java.lang.Thread.State: RUNNABLE
            at stack.JstackTest$Task.cal(JstackTest.java:29)
            - locked <0x000000076b7e5d90> (a java.lang.Object)
            at stack.JstackTest$Task.run(JstackTest.java:22)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    
    情况2:waiting for monitor entry [xxxxxx]: 操作系统线程正在等待获取 synchronized 的 monitor 对象进入同步代码,此时 Java 线程处于 BLOCKED 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x0000000020542800 nid=0x3554 waiting for monitor entry [0x000000002141f000]
       java.lang.Thread.State: BLOCKED (on object monitor)
            at stack.JstackTest$Task.cal(JstackTest.java:28)
            - waiting to lock <0x000000076b7e5d90> (a java.lang.Object)
            at stack.JstackTest$Task.run(JstackTest.java:22)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    对比下(1)和(2):
    (1)的详细调用信息里有:locked <0x000000076b7e5d90>,也就是 pool-1-thread-1 对 0x000000076b7e5d90 
    位置的对象进行了加锁,这个对象就是紧接着给出的 Object 对象,所以 pool-1-thread-1 处于 RUNNABLE 状态,
    正在执行同步代码;
    (2)的详细调用信息里有:waiting to lock <0x000000076b7e5d90>,也就是 pool-1-thread-2 在等待为 
    0x000000076b7e5d90 位置的对象加锁,这个对象就是紧接着给出的 Object 对象,所以 pool-1-thread-2 处于 BLOCKED 状态。
    可以看到,它们两个正在竞争相同的锁对象。
    当然(1)对应的 RUNNABLE 状态可能是不需要锁的情况,详细输出里也就不会有 locked <xxxxxx> 这个信息了。
    
    情况3:waiting on condition [xxxxxx]: 操作系统线程正在等待条件。
    3.1: 此时 Java 线程处于 WAITING 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x0000000020162000 nid=0xf8 waiting on condition [0x0000000020fce000]
       java.lang.Thread.State: WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x000000076b7e62f0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
            at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
            at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
            at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
            at stack.JstackTest$Task.cal(JstackTest.java:30)
            at stack.JstackTest$Task.run(JstackTest.java:25)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    3.2: 此时 Java  线程处于 TIMED_WAITING 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x0000000020374000 nid=0x49f8 waiting on condition [0x000000002120e000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x000000076b7e62f0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireNanos(AbstractQueuedSynchronizer.java:934)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireNanos(AbstractQueuedSynchronizer.java:1247)
            at java.util.concurrent.locks.ReentrantLock.tryLock(ReentrantLock.java:442)
            at stack.JstackTest$Task.cal(JstackTest.java:34)
            at stack.JstackTest$Task.run(JstackTest.java:29)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    可以看到,3.1 和 3.2 都是 parking to wait for  <0x000000076b7e62f0> 表示
    线程被 parking 等待 0x000000076b7e62f0 位置的对象,而这个对象就是紧接着给出的 
    ReentrantLock$NonfairSync.lock 对象。
    这里是使用 Lock 做显式锁的情况,3.1 和 3.2 的唯一区别就是调用 Lock.lock() 
    和 Lock.tryLock(时间,TimeUnit),前者没指定超时时间,所以就是 WAITING 状态,
    后者指定了所以就是 TIMED_WAITING 状态。
    除了 ReentrantLock 外,基于 AQS 的实现都可能出现这种情况,比如 CountDownLatch。
    
    情况4: in Object.wait() [xxxxxx]: 操作系统线程正处于 Object.wait() 状态。
    4.1: 此时 Java 线程处于 WAITING 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x000000001fa0f000 nid=0x9f0 in Object.wait() [0x00000000208bf000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0x000000076b7e5e00> (a java.lang.Object)
            at java.lang.Object.wait(Object.java:502)
            at stack.JstackTest$Task.cal(JstackTest.java:29)
            - locked <0x000000076b7e5e00> (a java.lang.Object)
            at stack.JstackTest$Task.run(JstackTest.java:23)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    4.2: 此时 Java 线程处于 TIMED_WAITING 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x000000001f7c9000 nid=0x252c in Object.wait() [0x000000002061f000]
       java.lang.Thread.State: TIMED_WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0x000000076b7e5e00> (a java.lang.Object)
            at stack.JstackTest$Task.cal(JstackTest.java:30)
            - locked <0x000000076b7e5e00> (a java.lang.Object)
            at stack.JstackTest$Task.run(JstackTest.java:23)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    可以看到,4.1 和 4.2 都是先 locked <0x000000076b7e5e00> 对了0x000000076b7e5e00 
    位置的对象进行了加锁,然后又 waiting on <0x000000076b7e5e00> 表示线程正在等待 0x000000076b7e5e00 
    位置的对象,而这两个操作的对象都是紧接着给出的 Object 对象。
    这里是使用 Object.wait() 做线程通信的情况,先要获取锁对象并在调用 wait() 后释放。
    4.1 和 4.2 唯一区别就是 Object.wait() 时是否指定了超时时间,没指定就是 WAITING 状态,
    指定了就是 TIMED_WAITING 状态,等待被唤醒或超时后自动唤醒。
    
    情况5:waiting on condition [xxxxxx]: 操作系统线程正在等待条件。
    5.1: 此时 Java 线程处于 WAITING 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x000000001fb23800 nid=0x3d0c waiting on condition [0x00000000209bf000]
       java.lang.Thread.State: WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x000000076b7e64f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
            at stack.JstackTest$Task.cal(JstackTest.java:34)
            at stack.JstackTest$Task.run(JstackTest.java:28)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    5.2: 此时 Java 线程处于 TIMED_WAITING 状态
    "pool-1-thread-2" #13 prio=5 os_prio=0 tid=0x000000001f75e800 nid=0x4900 waiting on condition [0x00000000205df000]
       java.lang.Thread.State: TIMED_WAITING (parking)
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x000000076b7e64f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
            at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2163)
            at stack.JstackTest$Task.cal(JstackTest.java:35)
            at stack.JstackTest$Task.run(JstackTest.java:29)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    可以看到,5.1 和 5.2 都是 parking to wait for  <0x000000076b7e64f8> 表示
    线程被 parking 等待 0x000000076b7e64f8 位置的对象,而这个对象就是紧接着给出的 ConditionObject 对象。
    这里是使用 Lock 和 Condition 做线程通信的情况,5.1 和 5.2 的唯一区别就是调用 Condition.await() 时
    是否指定了超时时间,没指定就是 WAITING 状态,指定了就是 TIMED_WAITING 状态,等待被唤醒或超时后自动唤醒。
    
    情况6:死锁,线程状态和堆栈信息和上边类似,重点看一下输出的死锁信息。
    Found one Java-level deadlock:
    =============================
    "Thread-1":
      waiting for ownable synchronizer 0x000000076b7d7828, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
      which is held by "Thread-0"
    "Thread-0":
      waiting for ownable synchronizer 0x000000076b7d7858, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
      which is held by "Thread-1"
    
    Java stack information for the threads listed above:
    ===================================================
    "Thread-1":
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x000000076b7d7828> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
            at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
            at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
            at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
            at stack.DeathLock.lambda$main$1(DeathLock.java:31)
            at stack.DeathLock$$Lambda$2/815033865.run(Unknown Source)
            at java.lang.Thread.run(Thread.java:748)
    "Thread-0":
            at sun.misc.Unsafe.park(Native Method)
            - parking to wait for  <0x000000076b7d7858> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
            at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
            at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
            at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
            at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
            at stack.DeathLock.lambda$main$0(DeathLock.java:18)
            at stack.DeathLock$$Lambda$1/1401420256.run(Unknown Source)
            at java.lang.Thread.run(Thread.java:748)
    
    Found 1 deadlock.
    
    情况7:socket IO
    "main" #1 prio=5 os_prio=0 tid=0x0000000002dbd000 nid=0xdc4 runnable [0x0000000002ebe000]
       java.lang.Thread.State: RUNNABLE
            at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
            at java.net.SocketInputStream.read(SocketInputStream.java:171)
            at java.net.SocketInputStream.read(SocketInputStream.java:141)
            at java.net.SocketInputStream.read(SocketInputStream.java:224)
            at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:337)
            at java.io.DataInputStream.readUTF(DataInputStream.java:589)
            at java.io.DataInputStream.readUTF(DataInputStream.java:564)
            at socket.ServerTest.main(ServerTest.java:30)
    如果 socket 是阻塞 IO ,当没有数据可读/可写时,线程是处于 RUNNABLE 状态的。
    
    除了上述这些情况外,还有可能是 Thread.sleep、Thread.join。
    

    七、jcmd

    jcmd(Java Virtual Machine Command),JVM 诊断命令,它是一个多功能命令,可以用来导出堆,查看 JVM 进程,导出线程堆栈信息,执行 GC 等。
    
    $ jcmd -h
    Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file> // main class 手动指定 main 类,很少有
       or: jcmd -l
       or: jcmd -h
    
      command must be a valid jcmd command for the selected jvm.
      Use the command "help" to see which commands are available.
      If the pid is 0, commands will be sent to all Java processes.
      The main class argument will be used to match (either partially
      or fully) the class used to start Java.
      If no options are given, lists Java processes (same as -p). // 
    
      PerfCounter.print display the counters exposed by this process // 打印目标 JVM 进程上可用的性能计数器,性能计数器的列表可能会随着 JVM 进程的不同而产生变化,实际上就是输出所有性能相关数据。
      -f  read and execute commands from the file // -f file:从文件 file 中读取命令,然后在目标 JVM 进程上调用这些命令。在file中,每个命令必须写在单独的一行。以"#"开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有 stop 关键字的命令,将会终止对 file 的处理。
      -l  list JVM processes on the local machine // 列出所有的 JVM 进程,默认等价于不加任何选项参数的 jcmd, 类似 jps
      -h  this help
    
    $ jcmd -l
    20660 sun.tools.jcmd.JCmd
    22996 org.jetbrains.idea.maven.server.RemoteMavenServer36
    22284
    
    $ jcmd 22996 PerfCounter.print
    22996:
    java.ci.totalTime=23162455
    java.cls.loadedClasses=3997
    java.cls.sharedLoadedClasses=0
    java.cls.sharedUnloadedClasses=0
    java.cls.unloadedClasses=0
    ...... // 还有很多不打印了
    
    $ jcmd pid help // 列出目标 JVM 进程可以执行的所有命令操作
    $ jcmd 22996 help 
    22996:
    The following commands are available:
    Compiler.CodeHeap_Analytics
    Compiler.codecache
    Compiler.codelist
    Compiler.directives_add
    Compiler.directives_clear
    Compiler.directives_print
    Compiler.directives_remove
    Compiler.queue
    GC.class_histogram
    GC.class_stats
    GC.finalizer_info
    GC.heap_dump 
    GC.heap_info
    GC.run
    GC.run_finalization
    JFR.check
    JFR.configure
    JFR.dump
    JFR.start
    JFR.stop
    JVMTI.agent_load
    JVMTI.data_dump
    ManagementAgent.start
    ManagementAgent.start_local
    ManagementAgent.status
    ManagementAgent.stop
    Thread.print
    VM.class_hierarchy
    VM.classloader_stats
    VM.classloaders
    VM.command_line
    VM.dynlibs
    VM.flags
    VM.info
    VM.log
    VM.metaspace
    VM.native_memory
    VM.print_touched_methods
    VM.set_flag
    VM.start_java_debugging
    VM.stringtable
    VM.symboltable
    VM.system_properties
    VM.systemdictionary
    VM.uptime
    VM.version
    help
    
    命令说明:
    JFR.stop:停止 JFR,执行命令:jcmd $PID JFR.stop name=abc,duration=120s
    JFR.start:启动 JFR,执行命令:jcmd $PID JFR.start name=abc,duration=120s
    JFR.dump:Dump JFR,等待至少duration(设定120s)后,执行命令:jcmd PID JFR.dump name=abc,duration=120s filename=abc.jfr(注意,文件名必须为.jfr后缀)
    JFR.check:检查 JFR 状态,执行命令:jcmd $PID JFR.check name=abc,duration=120s
    VM.native_memory:Java 8 给 HotSpot VM 引入了 Native Memory Tracking (NMT)特性,可以用于追踪 JVM 的内部内存使用。
        借助 -XX:NativeMemoryTracking=off|summary|detail 这个选项,JVM 支持我们查看它是如何分配原生内存的。原生内存跟踪(Native Memory Tracking, NMT)默认是关闭的(off)。如果开启了概要模式(summary)或详情模式(detail),可以随时通过 jcmd 命令获得原生内存的信息:jcmd pid VM.native_memory summary。
        如果 JVM 是使用 -XX:+PrintNMTStatistics 参数(默认false)启动的,它会在程序退出时打印原生内存分配信息。
    VM.check_commercial_features:检查商业功能是否锁定。
    VM.unlock_commercial_features:JFR 需要 JDK 的商业证书,该参数解锁 JDK 的商业功能 。在 JDK 8u40 之前,JVM 必须带启动标记: -XX:+UnlockCommercialFeatures -XX:FlightRecorder,从 JDK 8u40 开始,JFR 可以在运行时启用。
    ManagementAgent.stop:停止 JMX Agent
    ManagementAgent.start_local:开启本地 JMX Agent
    ManagementAgent.start:开启 JMX Agent
    GC.rotate_log:强制切割 Java 进程的 GC 日志文件
    Thread.print:打印 Java 线程堆栈信息, 参数 -l 打印 java.util.concurrent锁信息。相当于 jstack pid。
    GC.class_stats:提供有关 Java 类元数据的统计信息。需要 -XX:+UnlockDiagnosticvmOptions。
    GC.class_histogram:提供有关 Java 堆类的统计信息。相当于 jmap -histo pid,可以查看每个类的实例数量和占用空间大小。
    GC.heap_dump:生成 JVM 的 Heap dump(HPROF格式)文件。相当于 jmap -dump:format=b,file=heapdump.phrof pid,导出的 dump 文件,可以使用MAT 或者 Visual VM 等工具进行分析。
    GC.run_finalization:对 JVM 执行 java.lang.System.runFinalization()。执行一次finalization操作,相当于:System.runFinalization()。
    GC.run:对 JVM 执行 java.lang.System.gc(),告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的。相当于:System.gc()。
    VM.uptime:查看 JVM 的启动时长(s)。
    VM.flags:查看 JVM 的启动参数及其当前值。参数 -all 输出全部,相当于: jinfo -flags pid, jinfo -flag <VM FLAG> pid。
    VM.system_properties:查看 JVM 的系统配置信息。相当于: jinfo -sysprops pid。
    VM.command_line:打印用于启动此VM实例的命令行。相当于:jinfo pid | grep Command
    VM.version:查看目标 JVM 进程的版本信息
    
    $ jcmd 22996 Thread.print // 打印线程堆栈
    22996:
    2020-04-18 00:29:18
    Full thread dump OpenJDK 64-Bit Server VM (11.0.5+10-b520.17 mixed mode):
    
    Threads class SMR info:
    _java_thread_list=0x00000219de0da780, length=16, elements={
    0x00000219c3dcd800, 0x00000219dc330000, 0x00000219dc359800, 0x00000219dc3c0000,
    0x00000219dc3c2000, 0x00000219dc3c7000, 0x00000219dc3df000, 0x00000219dc3e8000,
    0x00000219dc56c000, 0x00000219dc58a800, 0x00000219dc99d000, 0x00000219dcae7800,
    0x00000219dcae8800, 0x00000219dcb43800, 0x00000219dcb66800, 0x00000219dcb3b800
    }
    
    "main" #1 prio=5 os_prio=0 cpu=703.13ms elapsed=3241.91s tid=0x00000219c3dcd800 nid=0x5a1c in Object.wait()  [0x000000a6cdbff000]
       java.lang.Thread.State: TIMED_WAITING (on object monitor)
            at java.lang.Object.wait(java.base@11.0.5/Native Method)
            - waiting on <0x00000000d0160600> (a java.lang.Object)
            at com.intellij.execution.rmi.RemoteServer.start(RemoteServer.java:91)
            - waiting to re-lock in wait() <0x00000000d0160600> (a java.lang.Object)
            at org.jetbrains.idea.maven.server.RemoteMavenServer36.main(RemoteMavenServer36.java:23)
    
    $ jcmd 22996 VM.flags // 打印 JVM 启动参数
    22996:
    -XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=268435456 -
    XX:MarkStackSize=4194304 -XX:MaxHeapSize=805306368 -XX:MaxNewSize=482344960 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5836300 -XX:NonProfiledCodeHea
    pSize=122910970 -XX:ProfiledCodeHeapSize=122910970 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOo
    ps -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
    
    $ jcmd 22996 GC.class_histogram // 打印类统计信息
    22996:
     num     #instances         #bytes  class name (module)
    -------------------------------------------------------
       1:         21331        2487152  [B (java.base@11.0.5)
       2:          4257         503096  java.lang.Class (java.base@11.0.5)
       3:         20174         484176  java.lang.String (java.base@11.0.5)
       4:         10248         327936  java.util.concurrent.ConcurrentHashMap$Node (java.base@11.0.5)
       5:          2193         306808  [I (java.base@11.0.5)
       6:          3152         277376  java.lang.reflect.Method (java.base@11.0.5)
       7:          4861         258744  [Ljava.lang.Object; (java.base@11.0.5)
       8:           674         223064  [C (java.base@11.0.5)
       9:          5254         168128  java.util.HashMap$Node (java.base@11.0.5)
      10:          3883         155320  java.util.LinkedHashMap$Entry (java.base@11.0.5)
    
    $ jcmd 22996 GC.heap_dump ./dump.hprof // 指定文件名进行 heap dump
    22996:
    Heap dump file created
    

    相关文章

      网友评论

          本文标题:参数

          本文链接:https://www.haomeiwen.com/subject/zltgmhtx.html