标记清除GC

Go语言的GC操作叫“三色标记”,有一些动图GIF来标记这个过程。大概的过程很好理解:

  1. 起初所有的对象都是白色
  2. 扫描所有可达对象,将其标记为灰色
  3. 扫描灰色对象,将其引用对象标记为灰色,自身标记为黑色

最后,未被标记的白色对象,就是需要被GC回收的。

比较奇怪,在GC过程中,如果对象本身是一个值类型,而不是指针类型,因为值类型压根不存在被引用的关系,那么GC会回收它吗?

GC回收的是堆上分配的对象,单个对象在堆中的存储包含两部分:

---------------
| head | body |
---------------

因为堆就是一块存储空间,这个里面放了很多对象,它需要通过head中的信息来取对应内存位置的对象。当GC执行之后,内存区间就会变的不连续,比如说这样:

----------------------------------------------------------------
| head | body |        | head | body |           | head | body |
----------------------------------------------------------------

这些空白的空间,被称为内存碎片,怎么更高效的使用它们呢?简单的方式是在创建对象的时候,遍历整个堆的空闲内存,如果发现某块空闲内存的空间大于或者等于申请的空间,就直接在这个位置创建。

或者跟memcache一样,把内存空间分成固定大小的内存块,虽然有一些坏处,比如说,如果划分的最小空间是2K,那么,即使创建的对象只需要1K,也需要额外浪费1K的空间。但好处是,在垃圾回收后,能更高效的利用碎片空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值