Java 中的垃圾回收算法

Java 中的垃圾回收(Garbage Collection,GC)机制通过多种算法实现对堆内存的管理。以下是常见的垃圾回收算法:


1. 标记-清除算法(Mark-Sweep)

工作原理

  • 标记阶段:遍历对象图,标记所有可达对象。
  • 清除阶段:清除未标记的不可达对象,回收内存。

特点

  • 简单直接,适用于基本场景。
  • 缺点
    • 清除后会产生大量内存碎片。
    • 标记和清除过程需要暂停应用线程(STW,Stop-The-World)。

示例

初始内存: [A][B][C][空][空]
标记阶段: [A*][B*][C*][空][空] (*表示可达)
清除阶段: [A][B][C][空][空]

2. 复制算法(Copying)

工作原理

  • 将内存分为两块,每次只使用其中一块。
  • 当一块内存满了时,将可达对象复制到另一块内存,并清空原来的内存。

特点

  • 优点

    • 简单高效,不会产生内存碎片。
  • 缺点
    • 可用内存减少为原来的一半。

使用场景

  • 常用于新生代垃圾回收(Minor GC)。

示例

初始内存: [A][B][C][空][空]
复制阶段: [空][空][空][A][B][C]

3. 标记-整理算法(Mark-Compact)

工作原理

  • 标记阶段:标记所有可达对象。
  • 整理阶段:将存活对象移动到内存的一端,清理掉其他空间。

特点

  • 优点

    • 不会产生内存碎片。
  • 缺点
    • 移动对象的过程会影响性能。

使用场景

  • 常用于老年代垃圾回收(Major GC 或 Full GC)。

示例

初始内存: [A][B][C][空][空]
标记阶段: [A*][B*][C*][空][空]
整理阶段: [A][B][C][空][空]

4. 分代回收算法(Generational Collection)

工作原理

  • 将堆内存划分为多个区域:

    • 新生代:存放短生命周期的对象。
    • 老年代:存放长生命周期的对象。
    • 永久代(JDK 7 及以前)/元空间(JDK 8 及以后):存放类元信息。

特点

  • 不同代使用不同的回收算法:

    • 新生代:采用复制算法。
    • 老年代:采用标记-清除或标记-整理算法。
  • 优点
    • 针对对象生命周期的特点进行优化,提高效率。

使用场景

  • 是当前 Java 垃圾回收的核心机制,大多数垃圾收集器都基于此设计。

5. 分区算法(Region-Based Collection)

工作原理

  • 将堆内存划分为多个相等的区域(Region)。
  • 每个区域可以动态作为新生代或老年代的一部分。
  • 优先回收垃圾最多的区域,减少整体回收时间。

特点

  • 优点

    • 更加灵活,能避免全堆扫描。
    • 提高内存管理效率。
  • 缺点
    • 实现较复杂,调优成本较高。

使用场景

  • G1 垃圾收集器是分区算法的典型应用。
假设堆内存分为多个区域:
[Region1][Region2][Region3][Region4][Region5]
垃圾最多的区域先被回收,例如优先回收 Region3。

6. 总结

算法类型 工作原理 优点 缺点 适用场景
标记-清除 标记可达对象,清除不可达对象 简单直接 会产生内存碎片,STW 明显 老年代或简单场景
复制 对象复制到另一块内存 高效,无碎片 内存利用率低 新生代
标记-整理 移动存活对象并清理无用对象 无碎片 移动对象耗时 老年代
分代回收 根据对象生命周期分代回收 效率高 实现复杂 新生代和老年代结合
分区算法 将堆分为多个区域,优先回收垃圾最多的区域 灵活高效 实现复杂 G1 垃圾收集器等

结论

  • 垃圾回收算法根据应用需求和对象特点选择合适的策略。
  • 现代 JVM 通常结合多种算法(如分代回收)以优化性能。

Java 中有哪些垃圾回收算法?的更多相关文章

  1. 深入理解java虚拟机【垃圾回收算法】

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  2. Java虚拟机之垃圾回收算法思想总结

    1.引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被其他所引用的时候计数器加1,而当引用失去时减1.这个方法有非常严重的问题:无法此话有理循环引用的情况,还有就是每次进行加减操作比较 ...

  3. Java中的垃圾回收算法详解

    一.前言   前段时间大致看了一下<深入理解Java虚拟机>这本书,对相关的基础知识有了一定的了解,准备写一写JVM的系列博客,这是第二篇.这篇博客就来谈一谈JVM中使用到的垃圾回收算法. ...

  4. java中的垃圾回收算法与垃圾回收器

    常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的 ...

  5. java虚拟机之垃圾回收算法

    标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...

  6. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  7. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  8. Java GC 垃圾回收算法 内存分配

    垃圾回收(Garbage Collection, GC)是Java不同于c与c++的重要特性之一. 他帮助Java自动清空堆中不再使用的对象. 由于不需要手动释放内存,程序员在编程中也可以减少犯错的机 ...

  9. JAVA虚拟机垃圾回收算法原理

    除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块.新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间.请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空 ...

  10. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

随机推荐

  1. uni-app消息提示框

    这个组件在界面==>交互反馈中 经常使用的哈: 特别注意:如果值title太长了,可能就一个值都不会显示 1.提示信息:可以用于操作某一项提示用户是否成功: uni.showToast({ ti ...

  2. 容器、容器云和容器化PaaS平台之间到底是什么关系?

    本文分享自天翼云开发者社区<容器.容器云和容器化PaaS平台之间到底是什么关系?>,作者:s****n 一直都有很多人迷惑于容器应该属于 IaaS 或是 PaaS 层,也搞不清楚容器云到底 ...

  3. Blazor开发框架KnownPro-创建新项目

    摘要 本文主要介绍如何使用Known专业版创建新项目. 操作步骤 登录Known专业版VIP会员管理系统. 进入首页,点击[创建项目]按钮. 弹出创建项目对话框,填写项目ID.名称和数据库类型(默认S ...

  4. [BZOJ4671] 异或图 题解

    我能说什么!抽象了这! 看到 \(n\le 10\) 的黑题顿感大事不妙. 我们考虑设 \(f(i)\) 表示将 \(n\) 个点划分为至少 \(i\) 个连通块时的方案数.我们可以暴力枚举每个点在哪 ...

  5. ABC391E题解

    大概评级:绿. 题目传送门. 显然动态规划,设 \(f_{i,k}\) 表示经过 \(i\) 次变换后能将 \(a_k\) 取反的最大值,显然答案为 \(f_{n,1}\),状态转移很简单,枚举 \( ...

  6. 码云git笔记

    以后要日常使用这个东西,所以今天又学习了下,具体链接如下: 码云帮助中心https://gitee.com/help/articles/4122 先记录一点简单的入门东西: Git 全局设置: git ...

  7. PDManer 入门教程:超强代码生成工具!

    PDManer 入门教程:超强代码生成工具!https://www.51cto.com/article/753161.html

  8. manim边学边做--局部缩放的场景类

    在动画制作中,尤其是数学和科学可视化领域,有时我们需要将观众的注意力集中在场景的某个特定部分. Manim提供了一个强大的工具 ZoomedScene,它允许我们在场景中创建一个独立的缩放视图,从而实 ...

  9. VNCTF2025_Crypto

    VNCTF2025_Crypto Simple prediction task.py from random import shuffle from Crypto.Util.number import ...

  10. rust学习笔记(7)

    crate 中文是货箱,这是我们编写自己的库或者程序的方式 库 使用rustc可以把一个文件编译为lib rustc --crate-type=lib rary.rs 构建的方式选择lib 编译出来的 ...