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

JVM 堆內存結構與 GC 機制深度解析:新生代、老年代、永久代、Minor/Full GC 觸發條件與日誌分析

     編輯:Java 綜合教學

JVM 堆內存模型(JDK 8 及之前)

堆是 JVM 管理的最大記憶體區域,存放物件實例。邏輯劃分:

  • 新生代:新物件誕生地,分 Eden、From Survivor (S0)、To Survivor (S1)。
  • 老年代:長期存活物件晋升區。
  • 永久代:存放 Class、Method、常量池等元資料(JDK 8 移至 Metaspace/元空間,非堆)。

JVM 堆結構圖

關鍵參數與預設比例

參數說明預設/建議
-Xms / -Xmx堆初始/最大大小生產建議設相同,避免震盪
-Xmn新生代大小通常為堆 1/3 ~ 1/4
-XX:NewRatio=n老年代:新生代 比值預設 2 (即新生代佔 1/3)
-XX:SurvivorRatio=nEden:Survivor 比值預設 8 (Eden:S0:S1 = 8:1:1)
-XX:MaxTenuringThreshold=n晋升老年代年齡閾值預設 15 (CMS 為 6)
-XX:PretenureSizeThreshold大物件直接進老年代閾值僅 Serial/ParNew 有效
-XX:PermSize / -XX:MaxPermSize永久代大小JDK 8 廢棄,改用 -XX:MetaspaceSize

記憶體分配與晋升規則

  1. 優先在 Eden 分配;Eden 滿 → Minor GC。
  2. 大物件(> PretenureSizeThreshold)直接進老年代,避免複製開銷。
  3. 長期存活物件:經 Minor GC 存活且能放入 Survivor,複製至 Survivor,年齡 +1;年齡 ≥ MaxTenuringThreshold → 晋升老年代。
  4. 動態年齡判定: Survivor 空間相同年齡物件總大小 > Survivor 一半,直接晋升,無需達 MaxTenuringThreshold。
  5. 空間分配擔保: Minor GC 前檢查老年代最大連續空間是否 > 新生代所有物件總大小;否則視 HandlePromotionFailure 決定是否觸發 Full GC。

垃圾收集器類型與演算法

GC 類型發生區域演算法特點
Minor GC新生代複製頻繁、快、回收率高 (70-95%)
Full GC (Major GC)老年代/永久代/整堆標記-清除 / 標記-整理耗時長、頻率低、會產生碎片 (標記-清除)

GC 日誌實戰解讀

啟動參數:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

範例 1:基本 GC 日誌

[GC [PSYoungGen: 1019K->568K(28672K)] 1019K->568K(92672K), 0.0529244 secs]
[Full GC [PSYoungGen: 568K->0K(28672K)] [ParOldGen: 0K->478K(64000K)] 568K->478K(92672K) [PSPermGen: 2484K->2483K(21504K)], 0.0178331 secs]

解析:

  • [GC ...]:Minor GC,PSYoungGen 區前後大小、總堆前後大小、耗時。
  • [Full GC ...]:Full GC,含 Young、Old、Perm 三區變化。
  • 堆快照:Heap PSYoungGen total 28672K, used 1505K ... eden space 25088K, 6% used ...

範例 2:指定參數驗證 (-Xms60m -Xmx60m -Xmn20m -XX:SurvivorRatio=8)

輸出顯示:新生代 total 18432K (≈18M) = Eden 16384K + 1 Survivor 2048K(另一 Survivor 空閒),老年代 40960K (≈40M),堆總 60M,符合預期。

方法區/永久代回收補充

  • 回收對象:廢棄常量(無引用的字面量)、無用類別(三條件:所有實例回收、ClassLoader 回收、Class 物件無引用)。
  • 參數 -Xnoclassgc 可關閉類別回收。
  • 大量反射、動態代理、JSP、OSGi 場景需開啟類別卸載防 PermGen OOM。

常用 JVM 監控與調優參數彙總

# 收集器選擇
-XX:+UseSerialGC           # 串行
-XX:+UseParallelGC         # 並行 (吞吐優先)
-XX:+UseConcMarkSweepGC    # CMS 低延遲
-XX:+UseG1GC               # G1 區域化 (JDK 9+ 預設)

# 並行調優
-XX:ParallelGCThreads=n
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n

# 診斷
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dump.hprof
-Xloggc:/path/to/gc.log
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved