京東面試:如何進行JVM調優(yōu)?
JVM 調優(yōu)是一個很大的話題,在回答“如何進行 JVM 調優(yōu)?”之前,首先我們要回答一個更為關鍵的問題,那就是,我們?yōu)槭裁匆M行 JVM 調優(yōu)?
只有知道了為什么要進行 JVM 調優(yōu)之后,你才能準確的回答出來如何進行 JVM 調優(yōu)?
要進行 JVM 調優(yōu)無非就是以下兩種情況:
- 目標驅動型的 JVM 調優(yōu),如,我們是為了最短的停頓時間所以要進行 JVM 調優(yōu),或者是我們?yōu)榱俗畲笸掏铝克砸M行 JVM 調優(yōu)等。
- 問題驅動型的 JVM 調優(yōu),因為生產環(huán)境出現了頻繁的 FullGC 了,導致程序執(zhí)行變慢,所以我們要進行 JVM 調優(yōu)。
所以,針對不同的 JVM 調優(yōu)的手段和側重點也是不同的。
總的來說,JVM 進行調優(yōu)的流程如下:
- 確定 JVM 調優(yōu)原因
- 分析 JVM(目前)運行情況
- 設置 JVM 調優(yōu)參數
- 壓測觀測調優(yōu)后的效果
- 應用調優(yōu)后的配置
具體來說它們的執(zhí)行如下。
1.確定JVM調優(yōu)原因
先確定是目標驅動型的 JVM 調優(yōu),還是問題驅動型的 JVM 調優(yōu)。
如果是目標性的 JVM 調優(yōu),那么 JVM 調優(yōu)實現思路就比較簡單了,如:
- 以最短停頓時間為目標的調優(yōu),只需要將垃圾收集器設置成以最短停頓時間的為目標的垃圾收集器即可,如 CMS 收集器或 G1 收集器。
- 以吞吐量為目標的調優(yōu),只需要將垃圾收集器設置為 Parallel Scavenge 和 Parallel Old 這種以吞吐量為主要目標的垃圾回收器即可。
如果是以問題驅動的 JVM 調優(yōu),那就要先分析問題是什么,然后再進行下一步的調優(yōu)了。
2.分析JVM運行情況
我們可以借助于目前主流的監(jiān)控工具 Prometheus + Grafana 和 JDK 自帶的命令行工具,如 jps、jstat、jinfo、jstack 等進行 JVM 運行情況的分析。
主要分析的點是 Young GC 和 Full GC 的頻率,以及垃圾回收的執(zhí)行時間。
3.設置JVM調優(yōu)參數
常見的 JVM 調優(yōu)參數有以下幾個:
- 調整堆內存大小:通過設置 -Xms(初始堆大?。┖?-Xmx(最大堆大小)參數來調整堆內存大小,避免頻繁的垃圾回收。
- 選擇合適的垃圾回收器:根據應用程序的性能需求和特點,選擇合適的垃圾回收器,如 Serial GC、Parallel GC、CMS GC、G1 GC 等。
- 調整新生代和老年代比:通過設置 -XX:NewRatio 參數來調整新生代和老年代的比例,優(yōu)化內存分配。
- 設置合適的堆中的各個區(qū)域比例:通過設置 -XX:SurvivorRatio 參數和 -XX:MaxTenuringThreshold 參數來調整 Eden 區(qū)、Survivor 區(qū)和老年代的比例,避免過早晉升和過多頻繁的垃圾回收。
- 設置對象從年輕代進入老年代的年齡值:-XX:InitialTenuringThreshold=7 表示 7 次年輕代存活的對象就會進入老年代。
- 設置元空間大小:在 JDK 1.8 版本中,元空間的默認大小會根據操作系統(tǒng)有所不同。具體來說,在 Windows 上,元空間的默認大小為 21MB;而在 Linux 上,其默認大小為 24MB。然而如果元空間不足也有可能觸發(fā) Full GC 從而導致程序執(zhí)行變慢,因此我們可以通過 -XX:MaxMetaspaceSize=設置元空間的最大容量。
4.壓測觀測調優(yōu)后的效果
JVM 參數調整之后,我們要通過壓力測試來觀察 JVM 參數調整前和調整后的差別,以確認調整后的效果。
5.應用調優(yōu)后的配置
在確認了 JVM 參數調整后的效果滿足需求之后,就可以將 JVM 的參數配置應用與生產環(huán)境了。