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

[TOC]

聲明

本篇文章是本人閱讀《深入理解JVM》和《java虛擬機規(guī)范》時的筆記。
記錄的都是一些概念性的東西。
JVM是HotSpot,jdk1.7。
大神繞路,不喜勿噴。

1 概覽

對于java程序員來說,javajavac、javadoc…… ,這些命令都能熟練地使用。
除了這些命令,在$JAVA_HOME/bin目錄下還有一些非常常用的命令。

在本人機器上,該目錄下的內(nèi)容如下:

$ 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 : 進程啟動時傳遞給入口函數(shù)(main)的參數(shù)
  • l : 輸出全類名或者jar包路徑
  • v : 進程啟動時傳遞的JVM參數(shù)

2.2 jstat

語法

C:\Users\hylexus>jstat -help
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

Definitions:
  <option>      要查詢的屬性或VM特性
                    -class 監(jiān)視類裝載、卸載數(shù)量、總空間以及類裝載耗費的時間
                    -gc 監(jiān)視Java的堆。比如Eden、survivor等
                    -gccapacity 和gc類似,但是主要關(guān)注點是堆中各個區(qū)域的容量
                    -gcutil 和gc類似,但是主要關(guān)注點是各個區(qū)域已使用部分占總?cè)萘康陌俜直?                    -gccause 和gcutil類似,但是會同時輸出導(dǎo)致上一次GC的原因
                    -gcnew 監(jiān)視新生代GC狀況
                    -gcnewcapacity ………………(容量)
                    -gcold ………………(老年代)
                    -gcoldcapacity ………………(容量)
                    -compiler JIT編譯器編譯過的方法、耗時等信息
                    -printcompilation 被JIT編譯器編譯過的方法
  <vmid>        VMID/LVMID:
                    在本地環(huán)境VMID和LVMID是一致的
                    遠程環(huán)境中VMID應(yīng)該是:
                        <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的進程的堆內(nèi)存各個區(qū)域占用總?cè)萘堪俜直龋?5秒刷新一次,共查詢3次

運行結(jié)果如下:

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的次數(shù)
  • YGCT: YGC 耗時0.578秒
  • FGC: Full GC==>老年代GC的次數(shù)
  • FGCT: FGC總耗時1.067秒
  • GCT: 所有GC總耗時1.645秒

2.3 jinfo

jinfo可以查看和調(diào)整虛擬機各項參數(shù)。

語法

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>         打印指定參數(shù)值
    -flag [+|-]<name>    啟用(+)或禁用(-)指定參數(shù)
    -flag <name>=<value> 設(shè)置指定參數(shù)的值
    -flags               打印JVM參數(shù)
    -sysprops            相當(dāng)于System.getProperites()
    <no option>          表示不帶任何選項,將打印出以上所提到的所有屬性

示例

打印出pid為67008的進程的JVM參數(shù)
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)可以生成堆轉(zhuǎn)儲快照(一般稱為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]        堆中對象信息統(tǒng)計。如類實例數(shù)量等。
                            live,只統(tǒng)計活著的對象信息
    -clstats             類加載器信息
    -finalizerinfo       打印出在F-Queue隊列中等待執(zhí)行finalizer()方法的對象信息
    -dump:<dump-options> 堆轉(zhuǎn)儲快照
                         dump-options:
                           live         只是dump出存活著的對象
                           format=b     binary format
                           file=<file>  可選,dump到哪個文件中
                         示例: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   當(dāng)JVM對-dump選項沒有響應(yīng)時可以是使用-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)是虛擬機堆轉(zhuǎn)儲快照分析工具。一般是用來分析用jmap生成的堆快照信息。

但是他的分析結(jié)果不太美觀,不是非常容易讀懂。
他會啟動一個內(nèi)置的http服務(wù)器來將分析結(jié)果展現(xiàn)為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就能看到分析結(jié)果:

jhat分析結(jié)果

2.6 jstack

jstack(Stack Trace for Java)可以生成虛擬機當(dāng)前時刻的線程快照。
一般稱為threaddump或者javacore文件。即每一條線程正在執(zhí)行的方法堆棧的集合。

語法

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  當(dāng)JVM不響應(yīng)該請求時強制進行線程dump
    -m  顯示java方法也可以是本地方法的堆棧信息
    -l  顯示有關(guān)鎖的附加信息

3 圖形化工具

對于這兩個可視化工具的使用就不在多說什么了。
點鼠標誰都會。

3.1 jconsole

jconsole

3.2 jvisualvm

jvisualvm

參考文章

  • 《深入理解JVM》
  • 《Java虛擬機規(guī)范》-JDK1.7
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容