JVM 調優總結
什麼是垃圾?
怎麼定位垃圾?
常見的垃圾回收演算法?
常見的垃圾回收器?如何選擇?
- 吞吐量優先的選擇PS+PO收集器
- 想要提升使用者體驗,響應時間優先,JDK8一般選擇G1,或者ParallelNew+CMS+SerialOld.
JVM記憶體分代模型?
注意JDK8之後MethodArea的變化。
什麼是JVM調優?
- 根據專案需求進行JVM規劃和預調優。
- 優化JVM執行環境。
- 解決JVM執行過程中的OOM問題。
QPS:Query Per Second 每秒查詢
TPS:Transaction Per Second 每秒執行事務
調優,
- 從業務場景開始,一定需要先了解業務場景。
- 監控:壓力測試的環境下調優。場景模擬,再現。
步驟:
-
熟悉業務場景,先確定想要追求的是什麼
- 響應時間優先:【ParallelNew+CMS+SerialOld.】需要給使用者快速響應。
- 吞吐量優先:【ParallelScavge+ParallelOld】業務程式碼執行時間 / 業務程式碼執行時間+GC時間
- 選擇垃圾回收器的組合
- 計算記憶體需求
- 選定CPU(越高越好)
- 設定年齡分代記憶體大小、物件升級年齡
- 設定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%,那麼一定有執行緒佔用系統資源。
- 找出那個程序cpu高。(top)
- 該程序的哪個執行緒cpu高。(top -Hp)
- 匯出該執行緒的堆疊資訊。(jstack)
- 找到方法(棧幀)的消耗時間(jstack)
top 檢視哪個程序的cpu比較高,然後根據程序號再去檢視程序中哪些執行緒cpu比較高,top -Hp xxx ,找到cpu飆高的執行緒,使用jstack命令查詢執行緒情況,jstack -l xxx, 【這裡的xxx需要是16進位制,因此需要將上一步找到的執行緒號轉換為16進位制】
先使用top命令檢視哪個程序cpu最高,使用jstack 查詢堆疊資訊,如果是佔用cpu的是GC執行緒,那麼此時一定在頻繁GC,需要使用jmap 查詢哪個物件太大了導致記憶體無法回收,可定位到程式碼問題。【jmap -dump 轉儲檔案時,這裡需要注意不適合在記憶體特別大的伺服器上執行,否則可能導致系統癱瘓】
系統記憶體飆高,如何排查?
- 匯出堆記憶體(jmap)
- 分析 (jhat jvisualvm mat jprofiler ... )
如何監控JVM
jstat jvisualvm jprofiler arthas top...
JVM常用引數。JVM日誌解讀。調優相關的概念。
如何解決各種OOM問題。