GC浅记

翻译: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.增减计数必须为原子操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值