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

Java 堆內存詳解:GC 核心區域、分代佈局與擴展策略

     編輯:Java 綜合教學

堆核心特性

  • 線程共享:JVM 啟動時創建,所有線程共用。
  • 對象實例主戰場:幾乎所有 new 對象、陣列在這裡分配。
  • GC 管理核心區:垃圾收集器主要掃描回收區域。
  • 容量可配置:-Xms 初始/最小、-Xmx 最大,支援動態擴縮。
  • 邏輯連續即可:物理內存可不連續。
  • OOM 條件:分配需求 > 最大可用(含擴展後仍不足)拋 OutOfMemoryError。

分代收集佈局(主流 HotSpot)

Java Heap
├── Young Generation (新生代)
│   ├── Eden Space (伊甸區)
│   ├── Survivor 0 (From)
│   └── Survivor 1 (To)
├── Old Generation (老年代)
└── Metaspace / PermGen (元空間/永久代) — 類元數據,非堆但常歸屬討論

新生代特點

  • 對象誕生於 Eden,Minor GC 後存活者進 Survivor 區輪換。
  • 年齡計數器達閾值(默認 15)晉升老年代。
  • 默認 Eden : S0 : S1 = 8 : 1 : 1(-XX:SurvivorRatio)。

老年代特點

  • 存放長期存活、大對象、動態年齡判定晉升對象。
  • Major GC / Full GC 觸發,頻率低、耗時長。

常見調優參數

參數含義
-Xms初始/最小堆大小
-Xmx最大堆大小
-Xmn新生代大小
-XX:SurvivorRatioEden/Survivor 比例
-XX:PretenureSizeThreshold大對象直接進老年代閾值
-XX:MaxTenuringThreshold晉升老年代年齡閾值

記憶體洩漏 vs 溢出

  • 洩漏:對象不可達但 GC 未回收(靜態集合持有、未關閉資源、ThreadLocal 洩漏)。
  • 溢出:活對象總量超過 -Xmx(堆太小、大對象分配、類加載過多導致元空間 OOM)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved