温馨提示×

温馨提示×

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

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

java垃圾回收怎样工作

发布时间:2026-10-30 16:29:50 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

Java 的垃圾回收(Garbage Collection,GC)是 JVM 自动管理内存的机制,核心目标是自动释放不再使用的对象所占用的堆内存,避免内存泄漏和手动管理内存的复杂性。

下面从 核心思想 → 如何判断垃圾 → 回收算法 → 堆结构 → 常见 GC 器 → 简单示例 来说明。


一、GC 的核心思想

当一个对象“不可能再被使用”时,它就可以被回收

Java 程序员不需要(也不能)显式释放对象内存,JVM 会在合适时机自动回收。


二、如何判断一个对象是否是“垃圾”

1. 引用计数法(Java 不用)

  • 给对象加计数器
  • 被引用 +1,引用失效 -1
  • 缺点:无法解决循环引用

❌ Java 不使用这种方式


2. 可达性分析(Java 使用)✅

从 GC Roots 出发,向下搜索:

GC Roots 包括:

  • 虚拟机栈中的局部变量
  • 方法区中的静态变量
  • 本地方法栈中的引用
  • 活跃线程

如果一个对象无法从 GC Roots 到达,就是垃圾。

GC Roots → A → B
             ↘ C(不可达 → 回收)

三、Java 堆内存结构(重要)

Java 堆通常分为:

堆
├── 年轻代(Young)
│   ├── Eden
│   ├── Survivor From
│   └── Survivor To
└── 老年代(Old)

对象分配流程

  1. 新对象先放 Eden
  2. Eden 满 → 触发 Minor GC
  3. 存活对象进入 Survivor
  4. 多次存活 → 进入 老年代

四、常见垃圾回收算法

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

  • 标记垃圾
  • 直接清除
  • 缺点:碎片多

2. 标记-整理(Mark-Compact)

  • 标记
  • 整理压缩
  • 适合老年代

3. 复制算法(Copying)

  • 内存一分为二
  • 存活对象复制到另一块
  • 适合年轻代

五、常见垃圾回收器

回收器 特点
Serial 单线程,简单
Parallel 多线程,吞吐优先
CMS 并发,低停顿(已废弃)
G1 分Region,平衡型(主流)
ZGC 超低延迟(JDK11+)

六、一个简单示例

public class Demo {
    public static void main(String[] args) {
        Object o = new Object();
        o = null; // 原对象不可达
        System.gc(); // 建议 JVM 回收(不保证立刻)
    }
}

七、总结一句话

Java GC 通过可达性分析找到垃圾对象,按代使用不同算法自动回收堆内存,开发者无需手动释放。

如果你愿意,我也可以:

  • 画 GC 流程图
  • 讲 G1 / ZGC 原理
  • 结合调优参数说明
  • 用面试角度总结

你想深入哪一块?

向AI问一下细节

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

AI
助
手