首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JVM 調優總結(七):分代 GC 典型配置舉例與 GC 日志解讀(上)

     編輯:Java 相關知識

堆大小設置原則

  • **上限**:32 位系統 1.5-2GB;64 位無理論上限(受物理內存限制)。
  • **最佳實踐**:-Xms = -Xmx 固定堆,避免動態擴縮容引發額外 GC。
  • **新生代關鍵**:Sun 官方建議 **堆的 3/8**。過小 → 頻繁 Minor GC;過大 → 老年代擠壓、Full GC 增加。

典型配置範例

基礎配置(手動指定比例)

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k \
     -XX:NewRatio=4 -XX:SurvivorRatio=4 \
     -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
  • -Xmn2g:新生代 2GB(含 Eden + 2 Survivor)。
  • -Xss128k:線程棧 128KB(JDK 5+ 默認 1MB),相同內存下可創建更多線程(~3000-5000)。
  • NewRatio=4:新生代:老年代 = 1:4(除永久代)。
  • SurvivorRatio=4:Eden:Survivor = 4:2(單 Survivor 佔新生代 1/6)。
  • MaxTenuringThreshold=0:對象**直接進老年代**,適合老年代對象多、新生代存活率低的場景;增大該值可延長對象在新生代存活,提升新生代回收率。

吞吐優先:並行收集器配置

# 僅新生代並行
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k \
     -XX:+UseParallelGC -XX:ParallelGCThreads=20

# 新生代+老年代雙並行(JDK 6+)
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k \
     -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

# 目標停頓時間自適應
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k \
     -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy

響應優先:CMS 並發收集器配置

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k \
     -XX:ParallelGCThreads=20 \
     -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

# 碎片整理
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k \
     -XX:+UseConcMarkSweepGC \
     -XX:CMSFullGCsBeforeCompaction=5 \
     -XX:+UseCMSCompactAtFullCollection
  • UseParNewGC:新生代並行收集,配合 CMS(JDK 5+ 自動開啟)。
  • 注意:開啟 CMS 後 NewRatio 可能失效,**建議显式用 -Xmn 指定新生代大小**。

GC 日志參數與輸出解讀

核心日志參數

-XX:+PrintGC                    簡要模式
-XX:+PrintGCDetails             詳細模式(新生代/老年代/永久代分別統計)
-XX:+PrintGCTimeStamps          時間戳(可混合)
-XX:+PrintGCApplicationConcurrentTime  應用運行時間
-XX:+PrintGCApplicationStoppedTime     應用停頓時間
-XX:+PrintHeapAtGC              GC 前後完整堆佈局(極詳細)
-Xloggc:gc.log                  重定向到文件(生產必備)

日志輸出範例解讀

[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[Full GC [Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
  • DefNew:新生代收集器名(Parallel Scavenge)。
  • 8614K->781K(9088K):收集前用量 -> 收集後用量 (總容量)。
  • 0.0123035 secs:該階段耗時。
  • 外層數據:整個堆的前後用量與總耗時。

PrintHeapAtGC 輸出結構

展示 GC 前後各代(def new generation、tenured generation、compacting perm gen、ro space、rw space)的 **總容量、已用、起始地址、各區(eden/from/to)詳細佈局**,適合深度分析對象分佈與晋升閾值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved