新手必看:垃圾回收的 5 个基本概念,看完不再迷茫

刚接触编程的小伙伴,大概率都被“垃圾回收”这个词绕晕过——明明代码写得好好的,怎么突然就冒出“内存泄漏”“GC 停顿”这些让人头大的问题?其实,垃圾回收(Garbage Collection,简称 GC)本质上是帮我们“打扫”内存的“清洁工”,搞懂它的核心概念,就能轻松避开很多基础坑。今天就用最直白的话,拆解垃圾回收的 5 个基本概念,新手也能一看就懂。

一、什么是“垃圾”?—— 不再被使用的内存资源

聊垃圾回收前,得先明确:这里的“垃圾”不是生活里的废纸塑料,而是程序运行中不再被任何变量引用、失去使用价值的内存数据

举个例子:你用 Python 定义了一个列表 list1 = [1,2,3],系统会给这个列表分配一块内存存数据;后来你又写了 list1 = None,这时候原来的列表数据就没人“认领”了——没有变量指向它,程序再也用不到它,这块内存就成了“垃圾”。

如果这些“垃圾”一直堆积,内存就会被占满,程序轻则卡顿,重则直接崩溃。而垃圾回收的核心工作,就是找到这些“垃圾”,并释放它们占用的内存。

二、引用:垃圾回收的“判断标尺”

怎么区分“有用数据”和“垃圾”?核心依据就是“引用”——引用是变量与内存数据之间的“连接关系”,只要数据被至少一个引用指向,就会被判定为“有用”,不会被回收

引用的形式很灵活,比如:

  • 直接引用:变量直接指向数据,比如 a = 10,变量 a 直接引用整数 10 所在的内存;

  • 间接引用:通过容器对象间接指向,比如 list2 = [a, 20],列表 list2 引用了 a 指向的内存,这就形成了间接引用。

举个反例:如果 a = None,同时 list2 也被赋值为 None,那整数 10 就失去了所有引用,会被 GC 标记为“垃圾”。简单说,没有引用的“孤魂野鬼”,就是 GC 的清理目标

三、标记-清除:最经典的垃圾回收算法

知道了“垃圾”的判断标准,GC 怎么动手清理?“标记-清除”(Mark and Sweep)是最基础、应用最广的算法,核心分两步走,像给房间大扫除一样:

  1. 标记阶段:从“根对象”(比如全局变量、当前栈帧中的局部变量,这些是程序运行的核心依赖,绝对不能删)出发,遍历所有能通过引用关联到的数据,给它们打上“有用”的标记;

  2. 清除阶段:遍历整个内存区域,把没有打“有用”标记的“垃圾”数据直接删除,释放对应的内存空间。

这个算法的优点是简单直观,但有个小问题:清理后内存会出现很多“碎片”——就像把书架上的书拿走后,留下的空位大小不一,后续想放一本大书(需要连续内存)可能就放不下。不过后续的“标记-整理”“复制算法”都是在它基础上优化的,搞懂它,就掌握了 GC 算法的核心逻辑。

四、GC 停顿:为什么程序会突然“卡一下”?

很多新手会遇到一个问题:程序运行得好好的,突然卡顿几十毫秒甚至几秒,排查后发现是“GC 停顿”导致的。这是因为,GC 在执行清理操作时,需要暂停程序的正常运行,避免程序在 GC 过程中修改内存数据,造成混乱——相当于打扫房间时,让所有人暂时停止活动,不然刚扫干净又被扔了垃圾。

比如 Java 的传统 GC 算法,在“标记-清除”的整个过程中,程序都会处于停顿状态,这就是“Stop-The-World”(STW)现象。不过现在的 GC 技术已经很先进了,像 Java 的 G1、ZGC,Python 的分代回收,都在尽量缩短停顿时间,甚至实现“几乎无停顿”,但核心逻辑没变——GC 要安全清理,就需要短暂“接管”内存操作

对新手来说,不需要过度纠结优化手段,只要知道:程序突然卡顿,大概率是 GC 在“加班干活”,如果卡顿严重,再去排查是否有内存泄漏(垃圾没被正常回收)的问题。

五、内存泄漏:GC 也搞不定的“顽固垃圾”

有人会问:既然有 GC 自动清理,怎么还会出现“内存泄漏”?因为 GC 不是万能的,它只会清理“无引用的垃圾”,如果数据明明没用了,却还被错误地保留着引用,GC 就会把它当成“有用数据”,一直留在内存里,这就是内存泄漏。

新手最容易踩的内存泄漏坑有两种:

  • 全局变量滥用:把临时数据存到全局列表里,用完后忘了删除,这些数据会一直被全局变量引用,永远不会被回收;

  • 循环引用:比如 A 引用 B,B 又引用 A,两个对象互相“绑定”,但程序里再也没人用到它们,这种情况下,部分简单的 GC 算法就无法识别它们是垃圾(不过现在主流 GC 都能解决循环引用问题,比如 Python 的标记-清除就支持)。

内存泄漏的危害是渐进式的:刚开始程序运行正常,随着“顽固垃圾”越来越多,内存占用越来越高,最终导致程序崩溃。所以新手写代码时,要养成“用完就释放引用”的习惯,比如把临时变量赋值为 None,或者用局部变量代替不必要的全局变量。

总结:新手该记住的核心逻辑

其实垃圾回收的本质很简单:用“引用”做标尺,通过算法找到“垃圾”,清理时短暂暂停程序,同时要警惕人为导致的“内存泄漏”。对新手来说,不用一开始就啃透复杂的 GC 优化技术,先搞懂这 5 个基本概念,再结合实际代码观察——比如用 Python 的 gc 模块查看回收情况,用 Java 的 JVisualVM 监控内存变化,很快就能对 GC 建立清晰的认知。

下次再遇到“GC 相关”的问题,不妨先问自己:这个数据有引用吗?它是不是垃圾?GC 清理时会暂停程序吗?想通这几个问题,很多困惑自然就迎刃而解了。你在学习中遇到过哪些 GC 相关的坑?欢迎在评论区留言分享~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canjun_wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值