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

JVM 記憶體結構與 GC 核心原理:運行時資料區、垃圾收集算法、Minor/Full GC 觸發條件

     編輯:Java 綜合教學

JVM 記憶體結構與 GC 核心原理完整總結

一、JVM 運行時資料區(五大區域)

JVM 記憶體結構圖

區域線程共享核心功能配置參數
程序計數器否記錄當前執行字節碼行號無
虛擬機棧否Java 方法執行模型:局部變數表、操作數棧、動態連接、方法出口-Xss
本地方法棧否Native 方法執行-XX:NativeStackSize
堆是物件實例分配區,GC 主戰場-Xms, -Xmx, -Xmn
方法區是類資訊、常量、靜態變數、JIT 編譯代碼-XX:MaxPermSize (JDK7) / -XX:MaxMetaspaceSize (JDK8+)

直接記憶體

非 JVM 運行時區域,NIO DirectByteBuffer 分配堆外記憶體,避免堆內複製,受 -XX:MaxDirectMemorySize 限制。

二、堆記憶體分代結構

堆分代結構圖

  • 新生代:Eden + Survivor (From + To),參數 -XX:SurvivorRatio(預設 8:1:1)
  • 老年代:存活多次 Minor GC 的物件
  • 永久代/元空間:方法區實作

三、物件存活判定算法

  1. 引用計數法:簡單但無法解決循環引用,JVM 未採用
  2. 可達性分析法:從 GC Roots 向下搜尋,無引用鏈則可回收

GC Roots 包含:

  • 虛擬機棧引用的物件
  • 方法區類靜態屬性/常量引用的物件
  • 本地方法棧 JNI 引用的物件
  • 同步鎖持有的物件

四種引用強度:

  • 強引用:Object o = new Object(),永不回收
  • 軟引用:SoftReference,記憶體不足時回收
  • 弱引用:WeakReference,下次 GC 回收
  • 虛引用:PhantomReference,唯一用途:收到 GC 通知

四、垃圾收集算法

算法原理優點缺點適用區域
標記-清除標記存活 → 清除未標記實現簡單記憶體碎片多老年代
複製劃分兩塊,存活物件複製到另一塊無碎片、分配快空間利用率 50%新生代
標記-整理標記 → 存活物件向一端移動 → 清理邊界外無碎片、空間利用率高需移動物件、更新引用老年代
分代收集新生代用複製,老年代用標記-整理/清除綜合效能最優實現複雜整個堆

五、GC 類型與觸發條件

Minor GC (Young GC)

  • 觸發:Eden 空間不足分配新物件
  • 範圍:僅新生代
  • 頻率:高,耗時短
  • 大物件直接進老年代(-XX:PretenureSizeThreshold)

Full GC

  • 觸發條件:
    1. 老年代空間不足
    2. 永久代/元空間不足
    3. 系統呼叫 System.gc()
    4. Heap 分配策略動態變化
    5. Minor GC 時老年代預留空間不足
  • 範圍:整個堆 + 方法區
  • 耗時:長,需盡量減少

六、常見記憶體洩漏場景

  • 靜態集合持有物件引用未清理
  • 監聽器/回調未移除
  • ThreadLocal 未 remove()
  • 連接池/資源池未正確釋放
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved