温馨提示×

温馨提示×

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

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

java垃圾回收怎样理解

发布时间:2026-09-19 03:44:13 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

理解 Java 的垃圾回收(Garbage Collection,GC),可以从「为什么需要 → 是什么 → 怎么工作 → 常见问题」这几个层次来把握。


一、为什么需要垃圾回收?

在 C / C++ 中,内存需要手动申请和释放(malloc / free、new / delete),容易出问题:

  • 内存泄漏:忘了释放
  • 悬空指针:提前释放但还在用
  • 重复释放:程序崩溃

Java 的设计目标是让程序员少管内存,于是引入了 GC:

JVM 自动判断哪些对象不再使用,并回收其占用的内存


二、什么是“垃圾”?

简单一句话:

没有被任何“可达引用”指向的对象,就是垃圾

示例

Object o = new Object();
o = null; // 原来的对象再也没有引用指向它 → 垃圾

判断标准(核心思想)

  • 从 GC Roots 出发
  • 能到达的对象:存活
  • 不能到达的对象:可回收

GC Roots 包括:

  • 栈中的局部变量
  • 静态变量
  • JNI 引用
  • 活跃线程

三、垃圾回收的基本过程

1️⃣ 标记(Mark)

找出哪些对象是“垃圾”

2️⃣ 清除 / 整理(Sweep / Compact)

  • 回收内存
  • 或整理内存,减少碎片

四、Java 堆内存结构(非常重要)

Java 堆一般分为:

┌───────────────┐
│  新生代 Young  │
│  ├ Eden        │
│  ├ S0          │
│  └ S1          │
├───────────────┤
│  老年代 Old    │
└───────────────┘

为什么分代?

经验规律:

  • 大多数对象“朝生夕死”
  • 少数对象长期存活

五、常见 GC 算法(理解思路即可)

1️⃣ 标记-清除

  • 简单
  • 会产生内存碎片

2️⃣ 复制算法(新生代常用)

  • 把存活对象复制到另一块
  • 效率高,但浪费空间

3️⃣ 标记-整理(老年代常用)

  • 标记 + 移动对象
  • 无碎片,但慢

六、对象什么时候进老年代?

  • 在 Survivor 区熬过多次 GC
  • 大对象直接进老年代
  • 空间分配担保失败

七、常见垃圾回收器(了解即可)

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

八、新手常见误解

❌ GC 是“实时清理”
✅ 它是按需触发,不是立刻

❌ 调用 System.gc() 一定会回收
✅ 只是“建议”,JVM 可忽略

❌ 没有引用就是立刻消失
✅ 要等 GC 运行


九、用一句话总结

Java 垃圾回收就是:JVM 通过可达性分析,自动找到不再被使用的对象,并释放其内存,让程序员不用手动管理内存。

如果你愿意,我也可以用生活比喻 / 图解 / 面试角度 / 源码级再讲一遍。

向AI问一下细节

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

AI
助
手