2012-01-30 29 views
18

我的問題是爲什麼Python使用引用計數和標記和掃描gc?爲什麼不只是標記和掃描?爲什麼Python使用引用計數和標記和掃描gc?

我最初的猜測是使用引用計數可以很容易地刪除非循環引用的對象,這可能會加快標記和掃描,並立即獲得內存。不知道我的猜測是否正確?

有什麼想法?

非常感謝。

回答

16

Python(語言)沒有說明它使用哪種形式的垃圾收集。主要實現(通常稱爲CPython)按照您的描述進行操作。其他版本如Jython或IronPython使用純垃圾收集系統。

是的,早期的引用計數收集有一個好處,但CPython使用它的主要原因是歷史的。最初沒有循環對象的垃圾收集,所以循環導致內存泄漏。 C API和數據結構主要基於引用計數原理。當添加真正的垃圾收集時,它不能打破現有的二進制API和依賴它們的所有庫,因此必須保留引用計數。

14

引用計數會立即釋放對象而不是垃圾回收。

但是,由於引用計數無法處理不可達對象之間的引用循環,因此Python使用垃圾回收器(實際上只是一個循環收集器)來收集存在的這些循環。

1

我最初的猜測是使用引用計數可以很容易地刪除非循環引用的對象,這可能會稍微加快標記和掃描並立即獲得內存。不知道我的猜測是否正確?

是的。只要refcount變爲零並且可以刪除對象。這不會在循環引用的對象中發生。 AFAIK,標記和掃描是一項代價高昂的操作,實現它的最簡單方法要求您在標記對象時「停止世界」。當遍歷所有對象時,未標記(可達)的對象被釋放。

相關問題