Can you summarize the following document?
        
  垃圾回收器有兩個基本的原理:

  

  

  最早的也是最簡單的垃圾回收實現方法,這種方法為佔用物理空間的物件附加一個計數器,當有其他物件引用這個物件時計數器加一,反之引用解除時減一。這種演算法會定期檢查尚未被回收的物件的計數器,為零的話則回收其所佔物理空間,因為此時的物件已經無法訪問。這種方法無法回收迴圈引用的儲存物件。

  近現代的垃圾回收實現方法,這種演算法會定期遍歷它管理的記憶體空間,從若干根儲存物件開始查詢與之相關的儲存物件,然後標記其餘的沒有關聯的儲存物件,最後回收這些沒有關聯的儲存物件佔用的記憶體空間。

  基於其標記和回收行為,又分為若干細緻方法。

  先暫停整個程式的全部執行執行緒,讓回收執行緒以單執行緒進行掃描標記,並進行直接清除回收,然後回收完成後,恢復執行執行緒。這樣會產生大量的空閒空間碎片,和使大容量物件不容易獲得連續的記憶體空間,而造成空間浪費。

  和“標記-清除”相似,不同的是,回收期間同時會將保留的儲存物件搬運彙集到連續的記憶體空間,從而整合空閒空間,避免記憶體碎片化。

  需要程式將所擁有的記憶體空間分成兩個部分。程式執行所需的儲存物件先儲存在其中一個分割槽(定義為“分割槽0”)。同樣暫停整個程式的全部執行執行緒,進行標記後,回收期間將保留的儲存物件搬運彙集到另一個分割槽(定義為“分割槽1”),完成回收,程式在本次回收後將接下來產生的儲存物件會儲存到“分割槽1”。在下一次回收時,兩個分割槽的角色對調。

  需要程式將所擁有的記憶體空間分成若干分割槽。程式執行所需的儲存物件會分佈在這些分割槽中,每次只對其中一個分割槽進行回收操作,從而避免暫停所有正在執行的執行緒來進行回收,允許部分執行緒在不影響回收行為下保持執行,並且降低迴收時間,增加程式響應速度。

  由於“複製”演算法對於存活時間長,大容量的儲存物件需要耗費更多的移動時間,和存在儲存物件的存活時間的差異。需要程式將所擁有的記憶體空間分成若干分割槽,並標記為年輕代空間和年老代空間。程式執行所需的儲存物件會先存放在年輕代分割槽,年輕代分割槽會較為頻密進行較為激進垃圾回收行為,每次回收完成倖存的儲存物件內的壽命計數器加一。當年輕代分割槽儲存物件的壽命計數器達到一定閾值或儲存物件的佔用空間超過一定閾值時,則被移動到年老代空間,年老代空間會較少執行垃圾回收行為。一般情況下,還有永久代的空間,用於涉及程式整個執行生命週期的物件儲存,例如執行程式碼、資料常量等,該空間通常不進行垃圾回收的操作。 通過分代,存活在侷限域,小容量,壽命短的儲存物件會被快速回收;存活在全域性域,大容量,壽命長的儲存物件就較少被回收行為處理干擾。  現今的GC(如Java和.NET)使用分代收集(generation collection),依照物件存活時間的長短使用不同的垃圾收集演算法,以達到最好的收集效能。  以Java為例,由記憶體管理程式管理的堆可以切割成為兩個部分: JVM對不同的世代使用不同的GC演算法。

  GC機制可以是由程式語言本身提供的功能(如Java、C#),也可以是程式語言以外的第三方函式庫。例如貝姆垃圾收集器就是一種可支援C/C++語言的自動記憶體管理工具。
在電腦科學中,垃圾回收(英語:Garbage Collection,縮寫為GC)是指一種自動的記憶體管理機制。當某個程式佔用的一部分記憶體空間不再被這個程式訪問時,這個程式會藉助垃圾回收演算法向作業系統歸還這部分記憶體空間。垃圾回收器可以減輕程式設計師的負擔,也減少程式中的錯誤。垃圾回收最早起源於LISP語言。目前許多語言如Smalltalk、Java、C#和D語言都支援垃圾回收器。