在計算機科學中,垃圾回收(,縮寫為GC)是指一種自動的記憶體管理機制。当某个程序占用的一部分内存空间不再被这个程序访问时,这个程序会借助垃圾回收算法向操作系统归还这部分内存空间。垃圾回收器可以减轻程式員的負擔,也減少程序中的错误。垃圾回收最早起源于LISP语言。目前許多語言如Smalltalk、Java、C#、Go和D语言都支援垃圾回收器。
原理
垃圾回收器有兩個基本的原理:
#考慮某個物件在未来的程式執行中,將不會被存取。
#回收這些物件所占用的記憶體。
分类
收集器实现
引用计数收集器
最早的也是最简单的垃圾回收实现方法,这种方法为占用物理空间的对象附加一个计数器,当有其他对象引用这个对象时计数器加一,反之引用解除时减一。这种算法会定期检查尚未被回收的对象的计数器,为零的话则回收其所占物理空间,因为此时的对象已经无法访问。这种方法无法回收循环引用的存储对象。
跟踪收集器
近现代的垃圾回收实现方法,这种算法会定期遍历它管理的内存空间,从若干根储存对象开始查找与之相关的存储对象,然后标记其余的没有关联的存储对象,最后回收这些没有关联的存储对象占用的内存空间。
回收算法
基于其标记和回收行为,又分为若干细致方法。
标记-清除
先暂停整个程序的全部运行线程,让回收线程以单线程进行扫描标记,并进行直接清除回收,然后回收完成后,恢复运行线程。這樣会产生大量的空闲空间碎片,和使大容量对象不容易获得连续的内存空间,而造成空间浪费。
标记-压缩
和“标记-清除”相似,不同的是,回收期间同时会将保留的存储对象搬运汇集到连续的内存空间,从而整-{}-合空闲空间,避免内存碎片化。
复制
需要程序将所拥有的内存空间分成两个部分。程序运行所需的存储对象先存储在其中一个分区(定义为“分区0”)。同样暂停整个程序的全部运行线程,进行标记后,回收期间将保留的存储对象搬运汇集到另一个分区(定义为“分区1”),完成回收,程序在本次回收后将接下来产生的存储对象会存储到“分区1”。在下一次回收时,两个分区的角色对调。
實作
GC机制可以是由程式語言本身提供的功能(如Java、C#),也可以是程序语言以外的第三方函式庫。例如貝姆垃圾收集器就是一種可支援C/C++語言的自動記憶體管理工具。
参见
- 内存管理
- 约翰·麦卡锡
参考文献
评论 (0)