1960年,人工智能之父 John McCarthy 在麻省理工大學做了一次重要演示


Lisp的擔心很快就變成了現實

垃圾回收雖然在賣力作業,可是系統還是恢復不了,


在編程的世界中,記憶體分配每時每刻都在發生,從底層來講,可以分為三類,

而Lisp中所有的資料都是“表”(List),都是在堆中動態分配的,如果它不支持GC,程式員管理表(List)估計就會瘋掉,
為此, John McCarthy于1960年發表了一篇論文,提出了標記-清除演算法,
演算法分為兩個階段, 第一個階段是標記, 從一個GC root集合出發,沿著“指標”找到所有活動物件

到了清除階段,只需要把那些沒有被標記的物件洗掉,釋放空間就行,

標記-清除演算法非常簡單,容易實作,現在垃圾收集演算法都是它的思想的延續,
僅此一點,McCarthy就可以成為GC演算法之父,

可是標記-清除演算法也有兩個要命的缺點:分配速度慢,容易產生碎片,

為了解決這個問題, 1963年, 另外一位人工智能之父”的Marvin L. Minsky提出了著名的復制演算法,

Minsky 的復制演算法需要把整個空間平均分成兩部分, 先在From空間進行分配,當From空間被占滿,GC將活動物件復制到To空間, 復制完成后, From和To進行互換,

復制演算法的第一步也是標記,但是找到活動物件以后,直接復制到另一半空間,所以能在較短時間內完成GC,
并且每次復制的時候,物件都會集中,避免碎片,

標記-清除演算法和復制演算法優缺點都非常明顯,
1960年, George E. Collins獨辟蹊徑,提出了一個新的GC演算法:參考計數

當時Collins可能沒有注意到,參考計數法有個缺點,就是它不能回收“回圈參考”

至此, 垃圾收集技術的三大演算法已經集齊,GC根本性的內容已經完成,后人只是在GC大廈上修修補補罷了,

三位GC大佬說得沒錯,1970年出現的標記-壓縮演算法就是標記-清除和復制演算法結合的產物,

標記壓縮演算法作業起來是這樣的:

標記-壓縮看起來和復制演算法很像,但是演算法實作要復雜得多

后來人們又發現:大部分物件的生存期限很短,生下來不久就變成垃圾

于是把物件進行分代,對不同的分代實施不同的垃圾收集演算法

幾十年過去了, 垃圾回收技術不斷完善, 計算機的性能也越來越高,
Lisp曾經遭遇的GC尷尬不會再出現了,GC逐漸成了編程語言的標配,


當然, 還有些編程語言在堅守,因為他們承擔著更重要的使命,

GC把程式員從記憶體管理中解放出來,世界上沒有免費的午餐,付出的代價就是多了虛擬機/解釋器這一層額外的開銷,
也許有這么一天,程式員既不需要操心記憶體空間的管理,又可以充分發揮硬體的效率,期望這一天能夠來臨,
嗯, 這一天其實已經來了,它就是Z語言, 參見《Z語言傳奇》
(完)
點擊下方圖片,查看更多文章吧 !




轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/295706.html
標籤:其他
下一篇:十大排序演算法
