翻译:http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
之前用c/c++,没有GC的概念,后来用php只知道是采用引用计数的方式进行垃圾回收。
学习go时,很多人说go的GC有问题,为此本篇从概念上一探究竟——GC是干嘛的?
概念
GC(garbage collection)是自动内存管理的意思,自动释放不再被对方占用的内存。
与之相对的是手动垃圾回收——由程序员告诉操作系统哪些内容没有被使用,并交还给操作系统(free,delete)
好处
- 开发高效
- 不用担心double free等内存泄露问题
坏处
- CPU计算开销:找出要释放的内存,有可能导致程序短时间卡顿
- GC时间无法预期, 对于硬实时环境、事务处理或交互式系统中可能无法接受GC时延
算法
常见的有两类算法:
- 跟踪性GC(mark-sweep)
- 引用计数
跟踪性GC
最常用的一种方式。包含两部:1.标记处那些正在被使用的对象(mark阶段);2.清理未被标记的对象(sweep)
go语言就采用这种方式,会导致内存野蛮生长,最终GC时出现卡顿
引用计数GC
为每个对象维护一个计数,每引用一次计数+1,每销毁一次计数-1。当引用计数为0时,认为是垃圾,被立即清除。
有如下缺点:
1.存在循环引用的风险
两个对象互相引用彼此,不过有特定算法可解决这个问题。
2.空间开销
3.性能开销
4.增减计数必须为原子操作