1. 程式人生 > 其它 >JVM 調優總結

JVM 調優總結

什麼是垃圾?

怎麼定位垃圾?

常見的垃圾回收演算法?

常見的垃圾回收器?如何選擇?

  • 吞吐量優先的選擇PS+PO收集器
  • 想要提升使用者體驗,響應時間優先,JDK8一般選擇G1,或者ParallelNew+CMS+SerialOld.

JVM記憶體分代模型?

注意JDK8之後MethodArea的變化。

什麼是JVM調優?

  1. 根據專案需求進行JVM規劃和預調優。
  2. 優化JVM執行環境。
  3. 解決JVM執行過程中的OOM問題。

QPS:Query Per Second 每秒查詢
TPS:Transaction Per Second 每秒執行事務 

調優,

  • 從業務場景開始,一定需要先了解業務場景。
  • 監控:壓力測試的環境下調優。場景模擬,再現。

步驟:

  1. 熟悉業務場景,先確定想要追求的是什麼
    1. 響應時間優先:【ParallelNew+CMS+SerialOld.】需要給使用者快速響應。
    2. 吞吐量優先:【ParallelScavge+ParallelOld】業務程式碼執行時間 / 業務程式碼執行時間+GC時間
  2. 選擇垃圾回收器的組合
  3. 計算記憶體需求
  4. 選定CPU(越高越好) 
  5. 設定年齡分代記憶體大小、物件升級年齡
  6. 設定GC引數:

生產環境gc引數設定:

-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause

-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log  指定日誌檔名稱,加時間字尾。
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M  滾動列印gc日誌檔案,分為5個,每個20M。
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause  列印gc詳情,時間戳,gc錯誤原因

1. 怎麼計算系統達到一定的TPS需要什麼樣的伺服器配置(記憶體+CPU)?

計算每一條TPS需要的記憶體先估計記憶體,再通過實際壓測不斷調整。

系統CPU經常100%,如何排查?

CPU經常100%,那麼一定有執行緒佔用系統資源。

  1. 找出那個程序cpu高。(top)
  2. 該程序的哪個執行緒cpu高。(top -Hp)
  3. 匯出該執行緒的堆疊資訊。(jstack)
  4. 找到方法(棧幀)的消耗時間(jstack)

top 檢視哪個程序的cpu比較高,然後根據程序號再去檢視程序中哪些執行緒cpu比較高,top -Hp xxx ,找到cpu飆高的執行緒,使用jstack命令查詢執行緒情況,jstack -l xxx, 【這裡的xxx需要是16進位制,因此需要將上一步找到的執行緒號轉換為16進位制】

先使用top命令檢視哪個程序cpu最高,使用jstack 查詢堆疊資訊,如果是佔用cpu的是GC執行緒,那麼此時一定在頻繁GC,需要使用jmap 查詢哪個物件太大了導致記憶體無法回收,可定位到程式碼問題。【jmap -dump 轉儲檔案時,這裡需要注意不適合在記憶體特別大的伺服器上執行,否則可能導致系統癱瘓】

系統記憶體飆高,如何排查?

  1. 匯出堆記憶體(jmap)
  2. 分析 (jhat jvisualvm mat jprofiler ... )

如何監控JVM

jstat jvisualvm jprofiler arthas top...

JVM常用引數。JVM日誌解讀。調優相關的概念。

如何解決各種OOM問題。