JVM 調優是一個很大的話題,在回答“如何進行 JVM 調優?”之前,首先我們要回答一個更爲關鍵的問題,那就是,我們爲什麼要進行 JVM 調優?
只有知道了爲什麼要進行 JVM 調優之後,你才能準確的回答出來如何進行 JVM 調優?
要進行 JVM 調優無非就是以下兩種情況:
- 目標驅動型的 JVM 調優,如,我們是爲了最短的停頓時間所以要進行 JVM 調優,或者是我們爲了最大吞吐量所以要進行 JVM 調優等。
- 問題驅動型的 JVM 調優,因爲生產環境出現了頻繁的 FullGC 了,導致程序執行變慢,所以我們要進行 JVM 調優。
所以,針對不同的 JVM 調優的手段和側重點也是不同的。
總的來說,JVM 進行調優的流程如下:
- 確定 JVM 調優原因
- 分析 JVM(目前)運行情況
- 設置 JVM 調優參數
- 壓測觀測調優後的效果
- 應用調優後的配置
具體來說它們的執行如下。
1.確定JVM調優原因
先確定是目標驅動型的 JVM 調優,還是問題驅動型的 JVM 調優。
如果是目標性的 JVM 調優,那麼 JVM 調優實現思路就比較簡單了,如:
- 以最短停頓時間爲目標的調優,只需要將垃圾收集器設置成以最短停頓時間的爲目標的垃圾收集器即可,如 CMS 收集器或 G1 收集器。
- 以吞吐量爲目標的調優,只需要將垃圾收集器設置爲 Parallel Scavenge 和 Parallel Old 這種以吞吐量爲主要目標的垃圾回收器即可。
如果是以問題驅動的 JVM 調優,那就要先分析問題是什麼,然後再進行下一步的調優了。
2.分析JVM運行情況
我們可以藉助於目前主流的監控工具 Prometheus + Grafana 和 JDK 自帶的命令行工具,如 jps、jstat、jinfo、jstack 等進行 JVM 運行情況的分析。
主要分析的點是 Young GC 和 Full GC 的頻率,以及垃圾回收的執行時間。
3.設置JVM調優參數
常見的 JVM 調優參數有以下幾個:
- 調整堆內存大小:通過設置 -Xms(初始堆大小)和 -Xmx(最大堆大小)參數來調整堆內存大小,避免頻繁的垃圾回收。
- 選擇合適的垃圾回收器:根據應用程序的性能需求和特點,選擇合適的垃圾回收器,如 Serial GC、Parallel GC、CMS GC、G1 GC 等。
- 調整新生代和老年代比:通過設置 -XX:NewRatio 參數來調整新生代和老年代的比例,優化內存分配。
- 設置合適的堆中的各個區域比例:通過設置 -XX:SurvivorRatio 參數和 -XX:MaxTenuringThreshold 參數來調整 Eden 區、Survivor 區和老年代的比例,避免過早晉升和過多頻繁的垃圾回收。
- 設置對象從年輕代進入老年代的年齡值:-XX:InitialTenuringThreshold=7 表示 7 次年輕代存活的對象就會進入老年代。
- 設置元空間大小:在 JDK 1.8 版本中,元空間的默認大小會根據操作系統有所不同。具體來說,在 Windows 上,元空間的默認大小爲 21MB;而在 Linux 上,其默認大小爲 24MB。然而如果元空間不足也有可能觸發 Full GC 從而導致程序執行變慢,因此我們可以通過 -XX:MaxMetaspaceSize=
設置元空間的最大容量。
4.壓測觀測調優後的效果
JVM 參數調整之後,我們要通過壓力測試來觀察 JVM 參數調整前和調整後的差別,以確認調整後的效果。
5.應用調優後的配置
在確認了 JVM 參數調整後的效果滿足需求之後,就可以將 JVM 的參數配置應用與生產環境了。
課後思考
除了以上常見的 JVM 調優參數之外,還有沒有其他重要的參數設置呢?
本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、併發、併發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。