垃圾回收 (計算機科學)
维基百科,自由的百科全书
在計算機科學中,垃圾回收(英语:Garbage Collection,縮寫為GC)是一種自動的記憶體管理機制。當一個電腦上的動態記憶體不再需要時,就應該予以釋放,以讓出記憶體,這種記憶體資源管理,稱為垃圾回收(garbage collection)。垃圾回收器可以讓程式員減輕許多負擔,也減少程式員犯錯的機會。垃圾回收最早起源于LISP语言。目前許多語言如Smalltalk、Java、C#都支援垃圾回收器。
特徵 [编辑]
垃圾回收器有兩個基本的原理:
- 考慮某個物件在未来的程式執行中,將不會被存取。
- 向這些物件要求歸回記憶體。
實作 [编辑]
GC的來源可能是由程式語言本身內建(如Java、C#)或是經由外面的函式庫所提供,而非建制於語言內部,例如貝姆垃圾收集器就是一種可支援C/C++語言的自動記憶體管理工具。
現今的GC(如Java和.NET)使用分代收集(generation collection),依照物件存活時間的長短使用不同的垃圾收集演算法,以達到最好的收集效能。
基礎的演算法有下面幾種方式,參考記數、追蹤收集、標記清除、複製收集、堆積壓縮、標記壓縮。
以Java為例,整個Java堆可以切割成為三個部分:
- Young:
- Eden:存放新生物件。
- Survivor:存放經過垃圾回收沒有被清除的物件。
- semi-Spaces:和Survivor做Copying collection。
- Tenured:物件多次回收沒有被清除,則移到該區塊。
- Perm:存放載入的類別還有方法物件。
Java不同的世代使用不同的GC演算法。
- Minor collection:
- YOUNG世代使用將Eden還有Survivor內的資料利用semi-space做複製收集(Copying collection),
- 並將原本Survivor內經過多次垃圾收集仍然存活的物件移動到Tenured。
- Major collection則會進行Minor collection,Tenured世代則進行標記壓縮收集。