GC要做的有两件事:
- 找到内存空间里的垃圾;
- 回收垃圾;
让程序员能再次利用这部分空间,满足这两项功能的程序就是 GC。
没有GC的语言会面临几个问题:
- 内存泄漏;
- 释放空间,没有将指针置为空,导致悬挂指针;
- 错误释放内存;
最初的GC算法是John McCarthy在1960年发布的。John McCarthy身为Lisp之父和人工智能之父,是一名非常有名的黑客,事实上他同时也是GC之父。
GC算法分类:
- 标记-清除算法:1960年,McCarthy在其论文中首次发布了GC算法。在这篇论文中发布的算法,就是现在我们所说的GC标记-清除算法;
- 引用计数算法:1960年,George E. Collins在论文中发布了叫作引用计数的 GC算法。当时Collins可能没有注意到,引用计数法有个缺点,就是它不能回收“循环引用” 。Harold McBeth在1963年指出了这个缺点;
- 复制算法:1963年,也有“人工智能之父”之称的Marvin L. Minsky在论文中发布了复制算法;
现在为世人所知的GC算法,不过是从这三种基本算法中衍生出来的产物。
网友评论