一分鐘說明
本文章主要是針對現網的cpu和內存性能分析,主要針對Java應用。
涉及知識點:
- top命令
- jstack工具(查看線程)
- jmap工具(查看內存堆棧)
- jstat工具(監控資源和性能)
- jvisualvm可視化工具(配合jmap一起使用)
top命令
- top -c
顯示進程運行信息列表
- 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
jstack <進程號> | grep <16進制線程號>
線程狀態說明
死鎖,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 -dump:format=b,file=heap.bin
把內存結構全部dump到二進制文件中
然後使用jvisualvm可視化工具查看內容結構(eclipse 的MemoryAnalyzer也可以)
jstat
- 使用jstat命令查看jvm的GC情況
- 引用:http://www.cnblogs.com/qmfsun/p/5601734.html
Options,選項,我們一般使用 -gcutil 查看gc情況 vmid,VM的進程號,即當前運行的java進程號 interval,間隔時間,單位爲秒或者毫秒 count,打印次數,如果缺省則打印無數次
通常運行命令如下:
jstat -gc 12538 5000
即會每5秒一次顯示進程號爲12538的java進成的GC情況,
顯示內容如下圖:
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 : 最大持有次數限制