标记清除GC

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

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

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

比较奇怪,在GC过程当中,若是对象自己是一个值类型,而不是指针类型,由于值类型压根不存在被引用的关系,那么GC会回收它吗?对象

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

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

由于堆就是一块存储空间,这个里面放了不少对象,它须要经过head中的信息来取对应内存位置的对象。当GC执行以后,内存区间就会变的不连续,好比说这样:垃圾回收

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

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

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

相关文章
相关标签/搜索