# GC算法與四種引用有哪些
## 目錄
1. [垃圾回收概述](#垃圾回收概述)
2. [常見GC算法詳解](#常見gc算法詳解)
- [標記-清除算法](#標記-清除算法)
- [標記-整理算法](#標記-整理算法)
- [復制算法](#復制算法)
- [分代收集算法](#分代收集算法)
3. [Java中的四種引用類型](#java中的四種引用類型)
- [強引用](#強引用)
- [軟引用](#軟引用)
- [弱引用](#弱引用)
- [虛引用](#虛引用)
4. [GC算法與引用類型的關聯](#gc算法與引用類型的關聯)
5. [總結](#總結)
---
## 垃圾回收概述
垃圾回收(Garbage Collection, GC)是自動內存管理的核心機制,主要解決以下問題:
- 對象內存分配
- 識別存活對象
- 回收死亡對象占用的空間
現代高級語言(如Java、Python)普遍采用GC機制,與C/C++等手動管理內存的語言形成對比。GC算法的選擇直接影響應用程序的:
- 吞吐量(Throughput)
- 停頓時間(Latency)
- 內存占用(Footprint)
---
## 常見GC算法詳解
### 標記-清除算法
**基本流程**:
1. 標記階段:從GC Roots出發,標記所有可達對象
2. 清除階段:遍歷堆內存,回收未標記對象
**特點**:
```java
// 偽代碼示例
void markAndSweep() {
// 標記階段
for (Object obj : reachableObjects) {
mark(obj);
}
// 清除階段
for (Object obj : heap) {
if (!isMarked(obj)) {
free(obj);
}
}
}
優缺點: - ? 實現簡單 - ? 產生內存碎片 - ? 清除階段會暫停應用(Stop-The-World)
改進點: 在標記完成后,將存活對象向內存一端移動
內存變化示意圖:
Before GC: [活][死][活][死][死][活]
After GC: [活][活][活][空][空][空]
適用場景: - 老年代回收(如CMS的Old GC) - 對內存連續性要求高的場景
核心思想: 將內存分為大小相等的兩塊,每次只使用一塊
執行過程: 1. 將存活對象復制到另一塊內存 2. 清空當前內存塊
優勢: - 避免內存碎片 - 分配速度快(只需移動指針)
局限: - 內存利用率僅50% - 適合對象存活率低的場景(如新生代)
設計原理: 根據對象生命周期將堆劃分為不同區域: - 新生代(Young Generation) - 使用復制算法(默認Eden:S0:S1=8:1:1) - 老年代(Tenured Generation) - 采用標記-清除/整理算法
GC類型: - Minor GC:只回收新生代 - Major GC:只回收老年代 - Full GC:回收整個堆
特點:
Object obj = new Object(); // 默認引用類型
實現方式:
SoftReference<Object> softRef = new SoftReference<>(new Object());
典型應用:
WeakReference<Object> weakRef = new WeakReference<>(new Object());
特殊用途:
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
引用類型 | GC算法配合 | 應用案例 |
---|---|---|
軟引用 | 分代收集 | 緩存系統 |
弱引用 | 任何算法 | WeakHashMap |
虛引用 | 需要ReferenceQueue | 資源清理跟蹤 |
算法 | 時間復雜度 | 空間復雜度 | 碎片問題 | 適用場景 |
---|---|---|---|---|
標記-清除 | O(n) | O(1) | 嚴重 | 老年代 |
標記-整理 | O(n) | O(1) | 無 | 老年代 |
復制 | O(n) | O(n) | 無 | 新生代 |
分代收集 | 組合復雜度 | 中等 | 部分解決 | 全堆回收 |
注意:不同JVM實現(HotSpot、Zing等)在GC算法和引用處理上可能存在差異,生產環境應進行針對性調優。
擴展閱讀: - G1垃圾收集器原理 - Reference對象源碼分析 “`
注:本文實際約3000字,完整3350字版本需要補充更多算法細節和性能數據圖表。建議擴展方向: 1. 添加各算法時間復雜度計算公式 2. 增加JVM參數調優實例 3. 補充ZGC/Shenandoah等新算法對比
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。