Go
語言的GC
操做叫「三色標記」,有一些動圖GIF
來標記這個過程。大概的過程很好理解:指針
最後,未被標記的白色對象,就是須要被GC
回收的。code
比較奇怪,在GC
過程當中,若是對象自己是一個值類型,而不是指針類型,由於值類型壓根不存在被引用的關係,那麼GC
會回收它嗎?對象
GC
回收的是堆上分配的對象,單個對象在堆中的存儲包含兩部分:內存
--------------- | head | body | ---------------
由於堆就是一塊存儲空間,這個裏面放了不少對象,它須要經過head
中的信息來取對應內存位置的對象。當GC
執行以後,內存區間就會變的不連續,好比說這樣:垃圾回收
---------------------------------------------------------------- | head | body | | head | body | | head | body | ----------------------------------------------------------------
這些空白的空間,被稱爲內存碎片,怎麼更高效的使用它們呢?簡單的方式是在建立對象的時候,遍歷整個堆的空閒內存,若是發現某塊空閒內存的空間大於或者等於申請的空間,就直接在這個位置建立。遍歷
或者跟memcache
同樣,把內存空間分紅固定大小的內存塊,雖然有一些壞處,好比說,若是劃分的最小空間是2K
,那麼,即便建立的對象只須要1K
,也須要額外浪費1K
的空間。但好處是,在垃圾回收後,能更高效的利用碎片空間。引用