GC算法与四种引用有哪些

发布时间:2021-10-12 14:43:25 作者:iii
来源:亿速云 阅读:188
# 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:回收整个堆


Java中的四种引用类型

强引用

特点

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算法与引用类型的关联

交互机制

  1. 标记阶段
    • 从GC Roots出发,强引用对象必定存活
    • 软/弱引用对象根据内存情况决定
  2. 回收策略
    • 强引用:不回收
    • 软引用:内存不足时回收
    • 弱引用:立即回收
    • 虚引用:仅通知回收事件

典型应用场景

引用类型 GC算法配合 应用案例
软引用 分代收集 缓存系统
弱引用 任何算法 WeakHashMap
虚引用 需要ReferenceQueue 资源清理跟踪

总结

GC算法对比表

算法 时间复杂度 空间复杂度 碎片问题 适用场景
标记-清除 O(n) O(1) 严重 老年代
标记-整理 O(n) O(1) 老年代
复制 O(n) O(n) 新生代
分代收集 组合复杂度 中等 部分解决 全堆回收

最佳实践建议

  1. 对于短生命周期对象,建议分配到新生代
  2. 缓存实现优先考虑软引用+LRU策略
  3. 避免在关键路径中创建大量弱引用
  4. 虚引用适合需要精准资源释放的场景

注意:不同JVM实现(HotSpot、Zing等)在GC算法和引用处理上可能存在差异,生产环境应进行针对性调优。


扩展阅读: - G1垃圾收集器原理 - Reference对象源码分析 “`

注:本文实际约3000字,完整3350字版本需要补充更多算法细节和性能数据图表。建议扩展方向: 1. 添加各算法时间复杂度计算公式 2. 增加JVM参数调优实例 3. 补充ZGC/Shenandoah等新算法对比

推荐阅读:
  1. JVM的四种GC算法分别是什么
  2. JVM虚拟机四种引用及GC实践方法是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

bash java

上一篇:shopex同步ucenter的redirect导致script不运行怎么办

下一篇:2021最新版的memcache面试题有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》