JDK自己提供了不少方便的JVM性能調優監控工具,有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具.java
1.jps(Java Virtual Machine Process Status Tool)算法
最經常使用的就是 jps -mlvV數組
jps主要用來輸出JVM中運行的進程狀態信息。語法格式以下:瀏覽器
jps [options] [hostid]服務器
若是不指定hostid就默認爲當前主機或服務器。工具
命令行參數選項說明以下:佈局
-q 不輸出類名、Jar名和傳入main方法的參數性能
-m 輸出傳入main方法的參數命令行
-l 輸出main類或Jar的全限名線程
-v 輸出傳入JVM的參數
2.jstack
最經常使用的用法有兩種:
jstack 1234
jstack -m 1234 #native+java棧
jstack主要用來查看某個Java進程內的線程堆棧信息。語法格式以下:
jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip
命令行參數選項說明以下:
-l long listings,會打印出額外的鎖信息,在發生死鎖時能夠用jstack -l pid來觀察鎖持有狀況
-m mixed mode,不只會輸出Java堆棧信息,還會輸出C/C++堆棧信息(好比Native方法)
jstack能夠定位到線程堆棧,根據堆棧信息咱們能夠定位到具體代碼,因此它在JVM性能調優中使用得很是多。
3.jinfo
最經常使用用法:jinfo -flags 1234
能夠輸出並修改運行時的java 進程的opts。用處比較簡單,就是能輸出並修改運行時的java進程的運行參數。用法是jinfo -opt pid 如:查看1234的MaxPerm大小能夠用 jinfo -flag MaxPermSize 1234
4.jmap(Memory Map)和jhat(Java Heap Analysis Tool)
最經常使用用法:
a.查看堆的狀況:jmap -heap 1234
b.dump:jmap -dump:live,format=b,file=/home/admin/logs/heap.bin 1234
或者:jmap -dump:format=b,file=/home/admin/logs/heap.bin 1234
c.查看堆被誰佔用了:jmap -histo 1234 | head -10
再結合btrace的分析
jmap用來查看堆內存使用情況,通常結合jhat使用。
jmap語法格式以下:
jmap [option] pid
jmap [option] executable core
jmap [option] [server-id@]remote-hostname-or-ip
使用jmap -heap pid查看進程堆內存使用狀況,包括使用的GC算法、堆配置參數和各代中堆內存使用狀況。
使用jmap -histo[:live] pid查看堆內存中的對象數目、大小統計直方圖,若是帶上live則只統計活對象
其中class name是對象類型,說明以下:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 數組,如[I表示int[]
[L+類名 其餘對象)
還有一個很經常使用的狀況是:用jmap把進程內存使用狀況dump到文件中,再用jhat分析查看。jmap進行dump命令格式以下:
jmap -dump:format=b,file=dumpFileName pid。注意若是Dump文件太大,可能須要加上-J-Xmx512m這種參數指定最大堆內存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。而後就能夠在瀏覽器中輸入主機地址:9998查看了
5.jstat
jstat參數不少,最經常使用的是 jstat -gcutil 1234 1000
先看JVM堆內存佈局:
堆內存 = 年輕代 + 年老代 + 永久代
年輕代 = Eden區 + 兩個Survivor區(From和To)
如今來解釋各列含義:
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總耗時