您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。