JVM性能分析與定位

一分鐘說明

本文章主要是針對現網的cpu和內存性能分析,主要針對Java應用。
涉及知識點:
- top命令
- jstack工具(查看線程)
- jmap工具(查看內存堆棧)
- jstat工具(監控資源和性能)
- jvisualvm可視化工具(配合jmap一起使用)

top命令

  • top -c
    顯示進程運行信息列表
    top -c
  • top -Hp <進程號>
    顯示這個進程下面的所有線程運行信息列表
    top -Hp <進程號>
    輸入大寫P,按CPU使用率降序;
    輸入大寫M,按內存使用率降序;
    TIME列就是各個Java線程耗費的CPU時間。

jstack工具

  • jstack是查看某個Java進程內的線程堆棧信息,JDK自帶工具。
  • jstack命令的語法格式:jstack <pid>。可以用jps查看java進程id。

  • 因爲堆棧裏,線程id是用16進製表示的。所以將獲取的線程號(十進制數)轉換成十六進制。eg:printf '%x\n' 9912
    轉化爲16進制

  • jstack <進程號> | grep <16進制線程號>
    jstack使用

  • 線程狀態說明

    死鎖,Deadlock(重點關注)
    執行中,Runnable
    等待資源,Waiting on condition(重點關注)
    等待獲取監視器,Waiting on monitor entry(重點關注)
    暫停,Suspended
    對象等待中,Object.wait() 或 TIMED_WAITING
    阻塞,Blocked(重點關注)
    停止,Parked

    參考鏈接:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html

jmap工具

  • jmap用來查看java程序堆內存使用狀況
  • 命令格式:jmap [ option ] pid

    -dump:[live,]format=b,file= 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件.
    -finalizerinfo 打印正等候回收的對象的信息.
    -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
    -histo[:live] 打印每個class的實例數目,內存佔用,類全名信息. VM的內部類名字開頭會加上前綴”*”. 如果live子參數加上後,只統計活的對象數量.
    -permstat 打印classload和jvm heap長久層的信息. 包含每個classloader的名字,活潑性,地址,父classloader和加載的class數量. 另外,內部String的數量和佔用內存數也會打印出來.
    -h | -help 打印輔助信息
    -F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.

  • *jmap -heap (查看實例)

    Attaching to process ID 31846, please wait…
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.71-b01
    using thread-local object allocation.
    Parallel GC with 4 thread(s)//GC 方式
    Heap Configuration: //堆內存初始化配置
    MinHeapFreeRatio = 0 //對應jvm啓動參數-XX:MinHeapFreeRatio設置JVM堆最小空閒比率(default 40)
    MaxHeapFreeRatio = 100 //對應jvm啓動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閒比率(default 70)
    MaxHeapSize = 2082471936 (1986.0MB) //對應jvm啓動參數-XX:MaxHeapSize=設置JVM堆的最大大小
    NewSize = 1310720 (1.25MB)//對應jvm啓動參數-XX:NewSize=設置JVM堆的‘新生代’的默認大小
    MaxNewSize = 17592186044415 MB//對應jvm啓動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
    OldSize = 5439488 (5.1875MB)//對應jvm啓動參數-XX:OldSize=:設置JVM堆的‘老生代’的大小
    NewRatio = 2 //對應jvm啓動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
    SurvivorRatio = 8 //對應jvm啓動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值
    PermSize = 21757952 (20.75MB) //對應jvm啓動參數-XX:PermSize=:設置JVM堆的‘永生代’的初始大小
    MaxPermSize = 85983232 (82.0MB)//對應jvm啓動參數-XX:MaxPermSize=:設置JVM堆的‘永生代’的最大大小
    G1HeapRegionSize = 0 (0.0MB)
    Heap Usage://堆內存使用情況
    PS Young Generation
    Eden Space://Eden區內存分佈
    capacity = 33030144 (31.5MB)//Eden區總容量
    used = 1524040 (1.4534378051757812MB) //Eden區已使用
    free = 31506104 (30.04656219482422MB) //Eden區剩餘容量
    4.614088270399305% used //Eden區使用比率
    From Space: //其中一個Survivor區的內存分佈
    capacity = 5242880 (5.0MB)
    used = 0 (0.0MB)
    free = 5242880 (5.0MB)
    0.0% used
    To Space: //另一個Survivor區的內存分佈
    capacity = 5242880 (5.0MB)
    used = 0 (0.0MB)
    free = 5242880 (5.0MB)
    0.0% used
    PS Old Generation //當前的Old區內存分佈
    capacity = 86507520 (82.5MB)
    used = 0 (0.0MB)
    free = 86507520 (82.5MB)
    0.0% used
    PS Perm Generation//當前的 “永生代” 內存分佈
    capacity = 22020096 (21.0MB)
    used = 2496528 (2.3808746337890625MB)
    free = 19523568 (18.619125366210938MB)
    11.337498256138392% used
    670 interned Strings occupying 43720 bytes.

  • jmap -histo (查看實例)

    jmap

  • jmap -dump:format=b,file=heap.bin

    把內存結構全部dump到二進制文件中
    然後使用jvisualvm可視化工具查看內容結構(eclipse 的MemoryAnalyzer也可以)

jstat

Options,選項,我們一般使用 -gcutil 查看gc情況 vmid,VM的進程號,即當前運行的java進程號 interval,間隔時間,單位爲秒或者毫秒 count,打印次數,如果缺省則打印無數次

通常運行命令如下:

jstat -gc 12538 5000
即會每5秒一次顯示進程號爲12538的java進成的GC情況,
顯示內容如下圖:
jstat

jstat -gc 21711 250 4
vmid是虛擬機ID,在Linux/Unix系統上一般就是進程ID。interval是採樣時間間隔。count是採樣數目。比如下面輸出的是GC信息,採樣時間間隔爲250ms,採樣數爲4

  • 說明

    S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used)
    EC、EU:Eden區容量和使用量
    OC、OU:年老代容量和使用量
    PC、PU:永久代容量和使用量
    YGC、YGT:年輕代GC次數和GC耗時
    FGC、FGCT:Full GC次數和Full GC耗時
    GCT:GC總耗時

  • 顯示內容說明如下(部分結果是通過其他其他參數顯示的,暫不說明):

    S0C:年輕代中第一個survivor(倖存區)的容量 (字節)
    S1C:年輕代中第二個survivor(倖存區)的容量 (字節)
    S0U:年輕代中第一個survivor(倖存區)目前已使用空間 (字節)

    S1U:年輕代中第二個survivor(倖存區)目前已使用空間 (字節)
    EC:年輕代中Eden(伊甸園)的容量 (字節)
    EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)
    OC:Old代的容量 (字節)
    OU:Old代目前已使用空間 (字節)
    PC:Perm(持久代)的容量 (字節)
    PU:Perm(持久代)目前已使用空間 (字節)
    YGC:從應用程序啓動到採樣時年輕代中gc次數
    YGCT:從應用程序啓動到採樣時年輕代中gc所用時間(s)
    FGC:從應用程序啓動到採樣時old代(全gc)gc次數
    FGCT:從應用程序啓動到採樣時old代(全gc)gc所用時間(s)
    GCT:從應用程序啓動到採樣時gc用的總時間(s)
    NGCMN:年輕代(young)中初始化(最小)的大小 (字節)
    NGCMX:年輕代(young)的最大容量 (字節)
    NGC:年輕代(young)中當前的容量 (字節)
    OGCMN:old代中初始化(最小)的大小 (字節)
    OGCMX:old代的最大容量 (字節)
    OGC:old代當前新生成的容量 (字節)
    PGCMN:perm代中初始化(最小)的大小 (字節)
    PGCMX:perm代的最大容量 (字節)
    PGC:perm代當前新生成的容量 (字節)
    S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比
    S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比
    E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比
    O:old代已使用的佔當前容量百分比
    P:perm代已使用的佔當前容量百分比
    S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (字節)
    S1CMX :年輕代中第二個survivor(倖存區)的最大容量 (字節)
    ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)
    DSS:當前需要survivor(倖存區)的容量 (字節)(Eden區已滿)
    TT: 持有次數限制
    MTT : 最大持有次數限制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章