python中的內存機制

首先要明白對象和引用的概念 (例子: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代垃圾。

標記清除

按需分配,當內存不夠的時候,從寄存器和程序棧上的引用出發,遍歷對象,將遍歷的對象打上標記,而後在內存中清除沒有標記的對象。

 

若有引用,請寫明轉載http://www.cnblogs.com/jingtyu/p/7472662.html

相關文章
相關標籤/搜索