Go
语言的GC
操做叫“三色标记”,有一些动图GIF
来标记这个过程。大概的过程很好理解:指针
最后,未被标记的白色对象,就是须要被GC
回收的。code
比较奇怪,在GC
过程当中,若是对象自己是一个值类型,而不是指针类型,由于值类型压根不存在被引用的关系,那么GC
会回收它吗?对象
GC
回收的是堆上分配的对象,单个对象在堆中的存储包含两部分:内存
--------------- | head | body | ---------------
由于堆就是一块存储空间,这个里面放了不少对象,它须要经过head
中的信息来取对应内存位置的对象。当GC
执行以后,内存区间就会变的不连续,好比说这样:垃圾回收
---------------------------------------------------------------- | head | body | | head | body | | head | body | ----------------------------------------------------------------
这些空白的空间,被称为内存碎片,怎么更高效的使用它们呢?简单的方式是在建立对象的时候,遍历整个堆的空闲内存,若是发现某块空闲内存的空间大于或者等于申请的空间,就直接在这个位置建立。遍历
或者跟memcache
同样,把内存空间分红固定大小的内存块,虽然有一些坏处,好比说,若是划分的最小空间是2K
,那么,即便建立的对象只须要1K
,也须要额外浪费1K
的空间。但好处是,在垃圾回收后,能更高效的利用碎片空间。引用