一常用工具命令學習
1.Jps 虛擬機進程狀況工具
功能:和UNIX PS 命令近似,列出正在運行的虛擬機進程,顯示虛擬機運行主類和本地虛擬機唯一進程ID (LVMID)
ex:jps -l

| 選項 | 作用 |
|---|---|
| -q | 只輸出LVMID,省略主類名稱 |
| -m | 輸出虛擬機啟動時傳遞給主類main()函數參數 |
| -l | 輸出主類全名,如果進程執行的是jar包,輸出jar路徑 |
| v | 輸出虛擬機進程啟動的JVM 參數 |
2.jstat 虛擬機統計信息監控工具
功能:監控虛擬機各種運行狀態的工具,可以顯示本地或者遠程的虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等數據
jstat vmid interval count
interval 查詢間隔 count 查詢次數
ex:jstat -gc 19277 500 5

| 選項 | 作用 |
|---|---|
| -class | 監控類加載、卸載數量、總空間以及類裝載所耗費的時間 |
| -gc | 監控java堆情況,包括Eden區,兩個survivor區,老年代,永久代等使用量、已用空間和耗時時間 |
| -gcutil | 監控內容與-gc基本相同,以百分比的形式標注使用空間和總量 |
| -gccause | 與-gcutil功能一致,附帶最后一次GC的原因 |
| ...... |
3.jinfo java配置信息工具
實時查看調整虛擬機各項參數
java -XX:+PrintCommandLineFlags -version
4.jmap java內存映像工具
功能:用於生成堆轉儲快照(heapdump或dump文件),查詢finalize執行隊列,Java堆和永久代詳細信息(空間使用率,哪種收集器)。
| 選項 | 作用 |
|---|---|
| -dump | 生成堆轉儲快照。格式:-dump:format=b,file=xx |
| -finalizerinfo | 顯示F-Queue中等待Finalizer線程執行finalize方法的對象 |
| -heap | 顯示堆詳細信息,使用哪種回收期、參數配置、分代情況等 |
| -histo | 顯示堆中對象統計信息,包括類、實例數量、合計容量 |
| -F | -dump沒反應,強制生成堆快照 |
jmap -dump:format=b,file=demo.bin 3500
jmap -histo:live 22583 | head -10
5.jhat 堆分析工具 (eclipse的mat更強大)
功能;內置小型HTTP服務,生成dump文件的分析結果可在web頁面分析
jhat demo.bin
6:jstack java堆棧跟蹤工具
功能:生成當前時刻的線程快照,線程快照是當前虛擬機當前每一條線程執行的方法堆棧集合,生成快照主要為了定為線程執行時間過長的原因。
jstack vmid
| 選項 | 命令 |
|---|---|
| -F | 強制輸出堆棧信息 |
| -l | 除了堆棧,顯示關於鎖的信息 |
| -m | 調用本地方法,可以顯示C/C++堆棧 |
二.線上故障案例分析
1.服務器部署若干服務,CPU報警。如何定位CPU過高,內存過載問題
- 找到最高的CPU進程 top -c


3.將線程PID轉化為16進制
printf "%x\n" 19755
4.查看堆棧信息
jstack 19277 |grep '4d2b' -C5 --color

2.定位內存溢出,OutOfMemeryError異常問題
模擬內存溢出demo
-verbose:gc -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/yangtuo/dump
package com.yangtuo.jvm; }
|
|---|
MAT 分析dump文件 ,對象占用內存比例判斷出存在大對象

查看詳情


三.JVM 參數調優
-Xms -Xmx -Xmn -Xss
1.盡可能讓對象留在年輕代
2.大對象直接進入老年代
-XX:PretenureSizeThreshold 3M 大於這個數直接在老年代分配
3.長期存活對象直接進入老年代
Minor GC后仍然存活並進入suvivor區,每次GC年齡+1
設置GC進入老年代的閥值 -XX:MaxTenuringThreshold=1
默認-XX:MaxTenuringThreshold=15
驗證jdk8和jdk7 結果不一致
1.7


1.8 MaxTenuringThreshold=1

1.8 MaxTenuringThreshold=15

