在 JDK 8 中,手動調優 G1 垃圾收集器可以通過以下步驟和參數進行:
1. 啟用 G1 垃圾收集器
要啟用 G1 垃圾收集器,需要在 JVM 啟動參數中添加以下選項:
-XX:+UseG1GC
這個參數告訴 JVM 使用 G1 作為垃圾收集器。
2. 設置堆內存大小
合理設置堆內存的初始大小和最大大小,可以使用以下參數:
-Xms4g -Xmx4g
這將設置初始堆大小和最大堆大小均為 4GB。
3. 設置最大 GC 暫停時間
G1 收集器的一個重要特點是低暫停時間,可以通過以下參數設置期望的最大 GC 暫停時間:
-XX:MaxGCPauseMillis=200
這個參數設置 G1 收集器在進行垃圾回收時,盡量將暫停時間控制在 200 毫秒以內。
4. 設置堆使用率閾值
G1 收集器會在堆使用率達到一定閾值時開始垃圾回收,可以通過以下參數設置這個閾值:
-XX:InitiatingHeapOccupancyPercent=45
這個參數表示當堆使用率達到 45% 時,G1 收集器會開始并發標記周期。
5. 設置 Region 大小
G1 收集器將堆內存劃分為多個 Region,可以通過以下參數設置每個 Region 的大小:
-XX:G1HeapRegionSize=32m
這個參數設置每個 Region 的大小為 32MB。
6. 設置并發標記線程數
G1 收集器在并發標記階段使用的線程數可以通過以下參數設置:
-XX:ConcGCThreads=4
這個參數設置并發標記線程數為 4。
7. 設置并行回收線程數
G1 收集器在并行回收階段使用的線程數可以通過以下參數設置:
-XX:ParallelGCThreads=8
這個參數設置并行回收線程數為 8。
8. 其他常用參數
-
禁用顯式 GC 調用:可以通過以下參數禁用
System.gc()
的顯式調用,避免可能的性能問題:-XX:+DisableExplicitGC
-
啟用字符串去重:可以通過以下參數啟用 JVM 的字符串去重功能,減少堆內存的占用:
-XX:+UseStringDeduplication
示例配置
以下是一個完整的示例配置,適用于一個具有 8 核心和 32GB 內存的機器:
java -XX:+UseG1GC -Xms16g -Xmx16g -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=4 -XX:ParallelGCThreads=8 -XX:+UseStringDeduplication -XX:+DisableExplicitGC -jar your-application.jar
監控和調優
-
使用監控工具:可以使用
jstat
、jmap
、jconsole
等工具監控 G1 收集器的性能。 -
分析 GC 日志:可以通過以下參數啟用 GC 日志記錄,并分析日志以發現性能瓶頸:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/yourapp-gc.log
通過以上步驟和參數,可以在 JDK 8 中手動調優 G1 垃圾收集器,以滿足應用的性能需求。