說說Python中的垃圾回收機制?

公衆號新增加了一個欄目,就是每天給大家解答一道Python常見的面試題,反正每天不貪多,一天一題,正好合適,只希望這個面試欄目,給那些正在準備面試的同學,提供一點點幫助!

小猿會從最基礎的面試題開始,每天一題。如果參考答案不夠好,或者有錯誤的話,麻煩大家可以在留言區給出自己的意見和討論,大家是要一起學習的 。

廢話不多說,開始今天的題目:

問:說說Python中的垃圾回收機制?

答:垃圾回收機制(Garbage Collection:GC)基本是所有高級語言的標準配置之一了,在一定程度上,能優化編程語言的數據處理效率和提高編程軟件開發軟件的安全性能 。在python中的垃圾回收機制主要是以引用計數爲主要手段以標記清除隔代回收機制爲輔的手段 。可以對內存中無效數據的自動管理!

下面分別來說說這三種的區別:

1、引用計數

Python語言默認採用的垃圾收集機制是:引用計數法,該算法最早George E. Collins在1960的時候首次提出,到如今已經快60年了,該算法依然被很多編程語言使用。

引用計數法核心原理是:每個對象維護一個ob_ref字段,用來記錄該對象當前被引用的次數,每當新的引用指向該對象時,它的引用計數ob_ref加1,每當該對象的引用失效時計數ob_ref減1,一旦對象的引用計數爲0,該對象立即被回收,對象佔用的內存空間將被釋放。

引用計數法有很明顯的優點:

高效,實時性能優秀,能在最短的時間獲得並運算對象引用數,對象有確定的生命週期,操作簡單,易於實現 。 

引用計數法也有明顯的缺點:

  • 維護引用計數消耗資源,維護引用計數的次數和引用賦值成正比,而不像mark and sweep等基本與回收的內存數量有關。

  • 無法解決循環引用的問題。A和B相互引用而再沒有外部引用A與B中的任何一個,它們的引用計數都爲1,但顯然應該被回收。

爲了解決這兩個致命弱點,Python又引入了以下兩種GC機制。

2、標記-清除

標記-清除算法是一種基於追蹤回收(tracing GC)技術實現的垃圾回收算法,主要是針對可能產生循環引用的對象進行的檢測機制 。它分爲兩個階段:第一階段是標記階段,GC會把所有的『活動對象』打上標記,第二階段是把那些沒有標記的對象『非活動對象』進行回收。

那麼GC又是如何判斷哪些是活動對象哪些是非活動對象的呢?

對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關係構成這個有向圖的邊。從根對象(root object)出發,沿着有向邊遍歷對象,可達的(reachable)對象標記爲活動對象,不可達的對象就是要被清除的非活動對象。根對象就是全局變量、調用棧、寄存器。

在上圖中,我們把小黑圈視爲全局變量,也就是把它作爲root object,從小黑圈出發,對象1可直達,那麼它將被標記,對象2、3可間接到達也會被標記,而4和5不可達,那麼1、2、3就是活動對象,4和5是非活動對象會被GC回收。

3、分代回收

分代回收是建立在標記清除技術基礎之上,是一種以空間換時間的操作方式 。Python將內存根據對象的存活時間劃分爲不同的集合,每個集合稱爲一個代,Python將內存分爲了3「代」,分別爲年輕代(第0代)、中年代(第1代)、老年代(第2代),他們對應的是3個鏈表,它們的垃圾收集頻率與對象的存活時間的增大而減小。

新創建的對象都會分配在年輕代,年輕代鏈表的總數達到上限時,Python垃圾收集機制就會被觸發,把那些可以被回收的對象回收掉,而那些不會回收的對象就會被移到中年代去,依此類推,老年代中的對象是存活時間最久的對象,甚至是存活於整個系統的生命週期內。

如果對於參考答案有不認同的,大家可以在評論區指出和補充,歡迎留言!

1、談談對 Python 和其他語言的區別?

2、談談對 Python3 和 Python2 的區別?

3、Python 的特點和優點是什麼?

4、說說Python解釋器種類以及特點?

5、說說4種常用編碼的區別?

6、說說Python面向對象三大特性?

7、說說Python中有幾種數據類型?

8、說說Python中xrange和range的區別?

9、Python變量、函數、類的命名規則?

10、說說Python可變與不可變數據類型?

11、說說Python模塊主要分哪三類?

12、列舉Python中的標準異常類?

13、Python中深拷貝與淺拷貝的區別?

14、Python中迭代器和生成器的區別?

15、Python可迭代對象怎麼獲取迭代器?

16、你瞭解什麼是 Python 之禪麼?

17、說說Python字典以及基本操作?

18、說說Python有幾種字符串格式化?

19、說說Python多線程與多進程的區別?

20、說說HTTP常見響應狀態碼?

21、Python 單引號、雙引號、三引號區別?

22、說說Python中猴子補丁是什麼?

關注小猿公衆號,每天學習一道題