首先要明白對象和引用的概念 (例子:a=1, a爲引用,1爲對象,對象1的引用計數器爲1,b=1此時內存中只有一個對象1,a,b都爲引用,對象的引用計數器此時爲2,由於有兩個引用)html
a=1,b=1
id(a)=id(b) #短的字符串,數字python在內存中是一個對象
a=[],b=[] id(a)!=id(b) #字典,數組這樣的對象在內存中python會new兩個不一樣的對象 a="new a string" b="new a string" #長的字符串python在內存中一樣會new兩個不一樣的對象 id(a)!=id(b)
引用計數器如何減小,當刪除該對象的引用時候該對象的引用計數器將會減小。python
a=[1,2]
b= [a,a] #a對象的引用計數爲2
del b[0] #a對象的引用計數變爲1
#字典同理
a=1 {"a":a,"b":a} #a對象的引用計數爲2 del b[b] #a對象的引用計數變爲1
python的垃圾回收(3種)數組
引用計數spa
當對象的引用的計數器變爲0的時候,該對象可能在內存中,可是已經不能訪問。python的垃圾回收時候不能作其餘操做,若是一個對象的引用計數變爲0的時候python就去回收該對象,那麼很顯然Python的效率會不好,那何時python會來回收呢?這是一個好問題。code
python會監聽本身new了多少個新的對象和有多少對象的引用計數器變爲了,兩個數值作差的到的數和閾值去比較,大於閾值,內存開始進行垃圾回收,銷燬引用計數器爲0的對象。htm
優勢:簡單實時性,缺點:維護引用計數消耗資源,循環引用。對象
分代回收blog
爲了提升效率,有不少對象,清理了不少次他依然存在,能夠認爲,這樣的對象不須要常常回收,能夠把它分到不一樣的集合,每一個集合回收的時間間隔不一樣。簡單的說這就是python的分代回收。內存
具體說一下,python中的垃圾分爲1,2,3代,在1代裏的對象每次回收都會去清理,當清理後有引用的對象依然存在,此時他會進入2代集合,同理2代集合清理的時候存在的對象會進入2代集合。資源
每一個集合的清理時間如何分配,會先清理1代垃圾,當清理10次一代垃圾後會清理一次2代垃圾,當清理10次2代垃圾後會清理2代垃圾。
標記清除
按需分配,當內存不夠的時候,從寄存器和程序棧上的引用出發,遍歷對象,將遍歷的對象打上標記,而後在內存中清除沒有標記的對象。