1. 程式人生 > 實用技巧 >JVM調優問題簡單總結

JVM調優問題簡單總結

JVM調優問題簡單總結

jvm調優在我看來就是擴擴記憶體,修改一下虛擬機器執行引數,再不行換個垃圾回收器,比如G1什麼的。

但是,對執行時問題的定位卻是個大問題,今天就來總結一下,這兩天學習的關於jvm調優的一些查用的排查方式

CPU突然飆升怎麼排查

因為在伺服器上不只有Java程序還有其他程序,所以需要使用top命令進行檢視,來,top命令

Linux top命令用於實時顯示 process 的動態。

使用許可權:所有使用者。

語法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

引數說明

  • d : 改變顯示的更新速度,或是在交談式指令列( interactive command)按 s
  • q : 沒有任何延遲的顯示速度,如果使用者是有 superuser 的許可權,則 top 將會以最高的優先序執行
  • c : 切換顯示模式,共有兩種模式,一是隻顯示執行檔的名稱,另一種是顯示完整的路徑與名稱
  • S : 累積模式,會將己完成或消失的子行程 ( dead child process ) 的 CPU time 累積起來
  • s : 安全模式,將交談式指令取消, 避免潛在的危機
  • i : 不顯示任何閒置 (idle) 或無用 (zombie) 的行程
  • n : 更新的次數,完成後將會退出 top
  • b : 批次檔模式,搭配 "n" 引數一起使用,可以用來將 top 的結果輸出到檔案內

使用截圖(以我的伺服器為例)

可以看到有很多的程序在執行.然後我們需要尋找的時java程序..貌似沒有,搞錯伺服器了......

我們換個伺服器重新來一次

這次可以看到啊,有Java程序在執行,然後可以看到用了0.3%的cpu,很少哈.如果說達到99%就說明時Java程式出問題了,就讓我們假設Java程式出了問題,來看看具體的Java中執行緒 使用的是top -Hp pid

這樣就可以看到有很多的Java執行緒在執行,就是圈主的那些,然後可以觀察哪個執行緒佔用最高,然後啊,因為這裡是10進位制,而線上程堆疊中顯示的是16進位制,可以使用windows自帶的計算器進行計算哈,如圖

看人家多貼心這裡的選中DEC後輸入數字就行了,然後檢視HEX對應的值

不過我這裡選的是另外一種方法,printf '%x\n' pid轉換 假設出問題的執行緒是16949

然後使用jstack pid|grep 16進位制的執行緒pid號進行檢視

這裡我的jstack命令不能用了...所以沒辦法截圖,正常情況下是顯示該執行緒的資訊

OOM怎麼排查

這裡OOM(OutOfMemoryError)溢位肯定是Java執行緒嘛,所以可以直接使用jps,檢視正在執行的Java執行緒

然後使用jmap -histo命令檢視,我們一般都是使用head -20檢視前20行,看看是哪些物件佔用的比較多.

補充

  1. 系統CPU經常100%,如何調優?(面試高頻) CPU100%那麼一定有執行緒在佔用系統資源,
    1. 找出哪個程序cpu高(top)
    2. 該程序中的哪個執行緒cpu高(top -Hp 程序id)
    3. 匯出該執行緒的堆疊 (jstack)
    4. 查詢哪個方法(棧幀)消耗時間 (jstack)
    5. 工作執行緒佔比高 | 垃圾回收執行緒佔比高(垃圾回收執行緒佔比高的話說明堆記憶體快滿了,每次full GC都只能回收一點資料,需要不停的進行回收)
  2. 系統記憶體飆高,如何查詢問題?(面試高頻) 你
    1. 匯出堆記憶體 (jmap)
    2. 分析 (jhat jvisualvm mat jprofiler ... )