top
使用top主要查看各進程CPU、內(nèi)存使用情況。

top命令截圖
top -Hp pid 還可以定位到某個具體線程,測試使用發(fā)現(xiàn)內(nèi)存那列都是一樣的(都顯示的進程占用的內(nèi)存),而CPU是不一樣的,所以top -Hp pid可以查看每個線程的CPU占用情況。

top -Hp pid命令截圖
當進程CPU占用比較高時,可以查看具體哪個線程使用CPU比較高,再通過
jstack pid |grep tid的十六進制 -A 30查看線程堆棧信息,從而定位導致CPU占用較高的代碼。
jmap
jmap可以查看堆內(nèi)存初始化配置信息以及堆內(nèi)存的使用情況。

jmap -heap pid命令截圖
我們可以使用 jmap -histo[:live] pid 查看堆內(nèi)存中的對象數(shù)目、大小統(tǒng)計直方圖,如果帶上 live 則只統(tǒng)計活對象。

jmap -histo[:live] pid命令截圖
還可以使用jmap -dump:format=b,file=name.dump pid 導出dump文件,用visualVM軟件進行分析。
當發(fā)生內(nèi)存溢出或老年代占用率過高,可以使用以上命令分析。
jstat
jstat -option可以監(jiān)測 Java 應用程序的實時運行情況,包括堆內(nèi)存信息以及垃圾回收信息,具體選項如下:
- -class:顯示 ClassLoad 的相關信息;
- -compiler:顯示 JIT 編譯的相關信息;
- -gc:顯示和 gc 相關的堆信息;
- -gccapacity:顯示各個代的容量以及使用情況;
- -gcmetacapacity:顯示 Metaspace 的大??;
- -gcnew:顯示新生代信息;
- -gcnewcapacity:顯示新生代大小和使用情況;
- -gcold:顯示老年代和永久代的信息;
- -gcoldcapacity :顯示老年代的大??;
- -gcutil:顯示垃圾收集信息;
- -gccause:顯示垃圾回收的相關信息(通 -gcutil),同時顯示最后一次或當前正在發(fā)生的垃圾回收的誘因;
- -printcompilation:輸出 JIT 編譯的方法信息。
這里詳細記錄下jstat -gcutil 時間間隔(毫秒)命令,這個命令會持續(xù)輸出堆內(nèi)存各個區(qū)的使用率和垃圾收集情況。
jstat -gcutil pid 時間間隔(毫秒)命令截圖 - S0:Survivor S0區(qū)的內(nèi)存使用率。
- S1:Survivor S1區(qū)的內(nèi)存使用率。
- E:Eden區(qū)的內(nèi)存使用率。
- O:老年代的內(nèi)存使用率。
- P:永久代的內(nèi)存使用率。
- YGC:Minor GC發(fā)生的次數(shù)。
- YGCT:Minor GC共消耗的時間(s)。
- FGC:Full GC發(fā)生的次數(shù)。
- FGCT:Full GC共消耗的時間。
- GCT:Minor GC 和 Full GC共消耗的時間。
jstack
jstack pid經(jīng)常用來查看線程的堆棧信息,通常結(jié)合top -Hp pid或pidstat -p pid -t來使用,比如通過top -Hp pid定位到了CPU使用率高的線程,再使用jstack pid可以定位CPU使用率高的代碼。

jstack pid命令截圖
