標記清除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的空間。但好處是,在垃圾回收後,能更高效的利用碎片空間。引用

相關文章
相關標籤/搜索