美文网首页
JVM系列-04-JDK自带的管理分析工具

JVM系列-04-JDK自带的管理分析工具

作者: hylexus | 来源:发表于2016-12-19 23:32 被阅读58次

    [TOC]

    声明

    本篇文章是本人阅读《深入理解JVM》和《java虚拟机规范》时的笔记。
    记录的都是一些概念性的东西。
    JVM是HotSpot,jdk1.7。
    大神绕路,不喜勿喷。

    1 概览

    对于java程序员来说,javajavacjavadoc…… ,这些命令都能熟练地使用。
    除了这些命令,在$JAVA_HOME/bin目录下还有一些非常常用的命令。

    在本人机器上,该目录下的内容如下:

    $ pwd
    /c/Program Files/Java/jdk1.8.0_101/bin
    $ ls
    appletviewer.exe*  javadoc.exe*         jcmd.exe*      jmap.exe*        jstatd.exe*        orbd.exe*         servertool.exe*
    extcheck.exe*      javafxpackager.exe*  jconsole.exe*  jmc.exe*         jvisualvm.exe*     pack200.exe*      sigar-amd64-winnt.dll*
    idlj.exe*          javah.exe*           jdb.exe*       jmc.ini          keytool.exe*       policytool.exe*   sigar-x86-winnt.dll*
    jabswitch.exe*     javap.exe*           jdeps.exe*     jps.exe*         kinit.exe*         rmic.exe*         tnameserv.exe*
    jar.exe*           javapackager.exe*    jhat.exe*      jrunscript.exe*  klist.exe*         rmid.exe*         unpack200.exe*
    jarsigner.exe*     java-rmi.exe*        jinfo.exe*     jsadebugd.exe*   ktab.exe*          rmiregistry.exe*  wsgen.exe*
    java.exe*          javaw.exe*           jjs.exe*       jstack.exe*      msvcr100.dll*      schemagen.exe*    wsimport.exe*
    javac.exe*         javaws.exe*          jli.dll*       jstat.exe*       native2ascii.exe*  serialver.exe*    xjc.exe*
    

    2 命令行工具

    2.1 jps

    喜欢linux的用户一定用过一个命令就是ps,为 Process Snapshot的缩写,也就是进程快照。
    此处的jps也就是 "Java Process Snapshot"(java进程快照)的缩写了。

    语法:

    C:\Users\hylexus>jps -help
    usage: jps [-help]
           jps [-q] [-mlvV] [<hostid>]
    
    Definitions:
        <hostid>:      <hostname>[:<port>]
    

    选项:

    • q : 只显示LVMID(Local Virtual Machine Identifier)而忽略主类名
    • m : 进程启动时传递给入口函数(main)的参数
    • l : 输出全类名或者jar包路径
    • v : 进程启动时传递的JVM参数

    2.2 jstat

    语法

    C:\Users\hylexus>jstat -help
    Usage: jstat -help|-options
           jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    Definitions:
      <option>      要查询的属性或VM特性
                        -class 监视类装载、卸载数量、总空间以及类装载耗费的时间
                        -gc 监视Java的堆。比如Eden、survivor等
                        -gccapacity 和gc类似,但是主要关注点是堆中各个区域的容量
                        -gcutil 和gc类似,但是主要关注点是各个区域已使用部分占总容量的百分比
                        -gccause 和gcutil类似,但是会同时输出导致上一次GC的原因
                        -gcnew 监视新生代GC状况
                        -gcnewcapacity ………………(容量)
                        -gcold ………………(老年代)
                        -gcoldcapacity ………………(容量)
                        -compiler JIT编译器编译过的方法、耗时等信息
                        -printcompilation 被JIT编译器编译过的方法
      <vmid>        VMID/LVMID:
                        在本地环境VMID和LVMID是一致的
                        远程环境中VMID应该是:
                            <lvmid>[@<hostname>[:<port>]]
      <lines>       Number of samples between header lines.
      <interval>    刷新时间间隔:
                        <n>["ms"|"s"],默认单位为毫秒。
      <count>       总共查询多少次.
      -J<flag>      Pass <flag> directly to the runtime system.
    

    示例:

    jstat -gcutil 67008 5s 3
    查看pid为67008的进程的堆内存各个区域占用总容量百分比,
    5秒刷新一次,共查询3次
    

    运行结果如下:

    C:\Users\hylexus>jstat -gcutil 67008 5s 3
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
      0.00  83.42   0.38  48.24  89.79  78.31     31    0.578     5    1.067    1.645
      0.00  83.42   0.38  48.24  89.79  78.31     31    0.578     5    1.067    1.645
      0.00  83.42   0.38  48.24  89.79  78.31     31    0.578     5    1.067    1.645
    

    说明:

    • S0: Survivor0(新生代Survivor)是空的
    • S1: Survivor1(新生代Survivor)是空的
    • E: Eden(新生代Eden)占用0.38%
    • O: Old(老年代)占用48.24%
    • M:
    • CCS:
    • YGC: Young GC==> Minor GC ==> 新生代GC的次数
    • YGCT: YGC 耗时0.578秒
    • FGC: Full GC==>老年代GC的次数
    • FGCT: FGC总耗时1.067秒
    • GCT: 所有GC总耗时1.645秒

    2.3 jinfo

    jinfo可以查看和调整虚拟机各项参数。

    语法

    C:\Users\hylexus>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>         打印指定参数值
        -flag [+|-]<name>    启用(+)或禁用(-)指定参数
        -flag <name>=<value> 设置指定参数的值
        -flags               打印JVM参数
        -sysprops            相当于System.getProperites()
        <no option>          表示不带任何选项,将打印出以上所提到的所有属性
    

    示例

    打印出pid为67008的进程的JVM参数
    C:\Users\hylexus>jinfo -flags 67008
    Attaching to process ID 67008, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.101-b13
    Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=41943040 -XX:MaxHeapSize=1258291200 -XX:MaxNewSize=419430400 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=13631488 -XX:OldSize=28311552 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
    Command line:  -Dosgi.requiredJavaVersion=1.8 -Xms40m -Xverify:none -Dorg.eclipse.swt.browser.IEVersion=10001 -Xmx1200m
    
    查询pid为67008的进程的初始堆大小
    C:\Users\hylexus>jinfo -flag InitialHeapSize 67008
    -XX:InitialHeapSize=41943040
    

    2.4 jmap

    jmap(Memory map)可以生成堆转储快照(一般称为heapdump或dump文件)

    语法

    C:\Users\hylexus>jmap -help
    Usage:
        jmap [option] <pid>
            (to connect to running process)
        jmap [option] <executable <core>
            (to connect to a core file)
        jmap [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        <none>               不带选项,打印出和Solaris下的pmap一样的信息
        -heap                打印出堆的详细情况
                                如垃圾收集器组合、分带情况等
                                只在Linux下有效
        -histo[:live]        堆中对象信息统计。如类实例数量等。
                                live,只统计活着的对象信息
        -clstats             类加载器信息
        -finalizerinfo       打印出在F-Queue队列中等待执行finalizer()方法的对象信息
        -dump:<dump-options> 堆转储快照
                             dump-options:
                               live         只是dump出存活着的对象
                               format=b     binary format
                               file=<file>  可选,dump到哪个文件中
                             示例: jmap -dump:live,format=b,file=heap.bin <pid>
        -F                   当JVM对-dump选项没有响应时可以是使用-F来强制dump
                                只在Linux/Solaris下有效
    

    示例

    jmap -heap 67008
    jmap -finalizerinfo 67008
    jmap -dump:live,format=b,file=t.bin 67008
    

    2.5 jhat

    jhat(JVM Heap Analysis Tool)是虚拟机堆转储快照分析工具。一般是用来分析用jmap生成的堆快照信息。

    但是他的分析结果不太美观,不是非常容易读懂。
    他会启动一个内置的http服务器来将分析结果展现为html格式。

    示例

    生成快照
    C:\Users\hylexus>jmap -dump:live,format=b,file=t.bin 67008
    Dumping heap to C:\Users\hylexus\t.bin ...
    Heap dump file created
    
    C:\Users\hylexus>
    # 分析快照
    C:\Users\hylexus>jhat t.bin
    Reading from t.bin...
    Dump file created Mon Dec 19 22:43:48 CST 2016
    Snapshot read, resolving...
    Resolving 1861041 objects...
    Chasing references, expect 372 dots....................................................................................................................................................................................................................................................................................................................................................................................
    Eliminating duplicate references....................................................................................................................................................................................................................................................................................................................................................................................
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.
    

    此时在浏览器里访问 127.0.0.1:7000就能看到分析结果:

    jhat分析结果

    2.6 jstack

    jstack(Stack Trace for Java)可以生成虚拟机当前时刻的线程快照。
    一般称为threaddump或者javacore文件。即每一条线程正在执行的方法堆栈的集合。

    语法

    C:\Users\hylexus>jstack -help
    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  当JVM不响应该请求时强制进行线程dump
        -m  显示java方法也可以是本地方法的堆栈信息
        -l  显示有关锁的附加信息
    

    3 图形化工具

    对于这两个可视化工具的使用就不在多说什么了。
    点鼠标谁都会。

    3.1 jconsole

    jconsole

    3.2 jvisualvm

    jvisualvm

    参考文章

    • 《深入理解JVM》
    • 《Java虚拟机规范》-JDK1.7

    相关文章

      网友评论

          本文标题:JVM系列-04-JDK自带的管理分析工具

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