对象不用了,内存怎么办

程序创建列表、对象和其他动态数据时,需要向内存系统申请空间。若逐个释放都由程序员负责,遗漏会使内存持续占用,过早释放又可能让程序访问失效位置。垃圾回收把一部分释放判断交给运行系统,但判断对象能否回收,仍需要明确、可执行的规则。

参考:[1] [2]

从根出发寻找存活对象

追踪式回收从运行系统已知仍在使用的根出发,沿对象中的指针寻找能够到达的数据。不能从根抵达的对象,即使相互引用,也不再属于程序可访问的部分。回收器据此识别可释放空间;具体如何标记、扫描或移动对象,则属于不同实现的算法安排。

参考:[1]

引用计数与循环引用

引用计数记录对象被引用的情况,在计数降为零时可以回收。但两个对象相互引用时,外界已经无法访问它们,计数仍可能不为零。CPython的gc模块文档说明,它提供的循环回收器补充已有引用计数机制;因此不能把Python的自动内存管理简单归结为其中一种办法。

参考:[2]

回收工作也占计算资源

自动管理并不是没有成本。追踪存活对象需要CPU时间,回收过于频繁会增加工作,间隔过长又可能需要更多内存。Go的指南把吞吐、内存与延迟作为需要一起权衡的量。若程序仍保留无用对象的可达引用,回收器也不能替程序理解业务意图并擅自删除它们。

参考:[1] [2]