python中的垃圾回收機制
阿新 • • 發佈:2020-12-22
簡介:
相信大家對C語言都不陌生,但是C語言有個很讓人煩心的事,就是需要程式設計師手動的去管理記憶體。如果寫一個專案,不小心忘記關閉申請的記憶體了,那麼將會導致記憶體洩漏,程式宕機。於是一些高階語言就誕生了。本文主要是介紹下python執行時中的垃圾回收機制,僅個人心得,歡迎大家討論。
內容:
在python中,python執行時是如何解決記憶體洩漏(垃圾回收)呢?
1.引用計數
class Person(object): def __init__(self): pass p=Person()
我們看這段程式碼,當執行到 p=Person() 時,python執行時自動幫我們申請了一塊記憶體。而當程式結束時,python會自動釋放這塊記憶體。這個過程中,python的具體實現:
當程式結束,python執行時會掃描記憶體,001號記憶體的引用數如果為0,那麼python執行時會把這塊記憶體釋放掉。
2. 隔代回收
python執行時中的引用計數能解決大部分的記憶體問題,當如果遇到記憶體相互引用時,例如:
class Person(object):
def __init__(self):
pass
class School(object):
def __init__(self):
pass
p=Person()
s=School()
p.Sch=s
s.Per=p
在這段程式碼中,p(001)記憶體中的Sch變數又指向s(002記憶體)。s(002)記憶體中的Per變數又指向p(001記憶體)。在相互引用下,001記憶體和002記憶體的引用計數都為:2。
當這段程式碼結束時,p和s都銷燬了,但是001和002記憶體的引用 計數還是為1,那麼引用計數的方式就難以實現記憶體釋放了。如果是有8、9個變數相互引用呢
這時,隔代回收機制就由此而來。隔代回收機制。
1. 先找出所有有迴圈引用的記憶體。
2. 每隔一段時間,將所有迴圈引用的記憶體的引用計數-1
這樣就能解決迴圈引用的問題了。當然,如果是兩個記憶體中多個變數的迴圈應用,我猜想,如果是我,我會先掃描每塊記憶體中的變數,然後去重複。