本页使用了标题或全文手工转换

垃圾回收 (計算機科學)

维基百科,自由的百科全书
跳转至: 导航搜索

在計算機科學中,垃圾回收英语Garbage Collection,縮寫為GC)是一種自動的記憶體管理機制。當一個電腦上的動態記憶體不再需要時,就應該予以釋放,以讓出記憶體,這種記憶體資源管理,稱為垃圾回收(garbage collection)。垃圾回收器可以讓程式員減輕許多負擔,也減少程式員犯錯的機會。垃圾回收最早起源于LISP语言。目前許多語言如SmalltalkJavaC#D语言都支援垃圾回收器。

特徵[编辑]

垃圾回收器有兩個基本的原理:

  1. 考慮某個物件在未来的程式執行中,將不會被存取。
  2. 向這些物件要求歸回記憶體。

實作[编辑]

GC的來源可能是由程式語言本身內建(如Java、C#)或是經由外面的函式庫所提供,而非建制於語言內部,例如貝姆垃圾收集器就是一種可支援C/C++語言的自動記憶體管理工具。

現今的GC(如Java.NET)使用分代收集(generation collection),依照物件存活時間的長短使用不同的垃圾收集演算法,以達到最好的收集效能。

基礎的演算法有下面幾種方式,參考記數、追蹤收集、標記清除、複製收集、堆積壓縮、標記壓縮。

以Java為例,整個Java堆可以切割成為三個部分:

  1. Young:
    1. Eden:存放新生物件。
    2. Survivor:存放經過垃圾回收沒有被清除的物件。
    3. semi-Spaces:和Survivor做Copying collection。
  2. Tenured:物件多次回收沒有被清除,則移到該區塊。
  3. Perm:存放載入的類別還有方法物件。

Java不同的世代使用不同的GC演算法。

  1. Minor collection:
    YOUNG世代使用將Eden還有Survivor內的資料利用semi-space做複製收集(Copying collection),
    並將原本Survivor內經過多次垃圾收集仍然存活的物件移動到Tenured。
  2. Major collection則會進行Minor collection,Tenured世代則進行標記壓縮收集。