day3(1)

Cpython解釋器的垃圾回收機(jī)制:

什么是垃圾色难?

當(dāng)一個(gè)值身上沒有綁定任何變量名(該值的引用數(shù)為零)該值就是垃圾拇砰。

小整數(shù)對(duì)象池:

整數(shù)在程序中使用非常規(guī)范,python為了優(yōu)化速度扬虚,使用了小整數(shù)對(duì)象池重罪,避免為了頻繁申請(qǐng)和銷毀內(nèi)存空間樱哼。python對(duì)小整數(shù)的定義是[-5,256]這些整數(shù)對(duì)象是提前建好的哀九,不會(huì)被垃圾回收。在python中小整數(shù)對(duì)象池范圍內(nèi)的整數(shù)使用的都是同一個(gè)對(duì)象搅幅。同理單個(gè)字母也是阅束,但當(dāng)定義相同的2個(gè)字符串時(shí),引用計(jì)數(shù)為零時(shí)茄唐,才會(huì)調(diào)用垃圾回收機(jī)制息裸。

大整數(shù)對(duì)象池:

每一個(gè)大整數(shù)都定義一個(gè)新的對(duì)象。

intern機(jī)制
a1 = 'xiake'
a2 = 'xiake'
a3 = 'xiake'

python不會(huì)創(chuàng)建三個(gè)對(duì)象沪编,如果是的話內(nèi)存恒容易溢出呼盆,所以python有intern機(jī)制,可以讓他們只占用一個(gè) xiake 蚁廓。

小總結(jié):

小整數(shù)[-5,256]共用對(duì)象访圃,常駐內(nèi)存
單個(gè)字符共用對(duì)象,常駐內(nèi)存
單個(gè)單詞相嵌,不可修改腿时,默認(rèn)開啟了intern機(jī)制,共用對(duì)象,引用計(jì)數(shù)為零時(shí)饭宾,銷毀
字符串(含有空格)批糟,不可以修改,沒開啟intern看铆,不共用對(duì)象徽鼎,引用計(jì)數(shù)為零時(shí)銷毀
大整數(shù)不共用內(nèi)存,引用計(jì)數(shù)為零時(shí)銷毀
數(shù)值類型與字符串類型在python中都是不可變的弹惦,這就意味著你無法修改對(duì)象值否淤,每次對(duì)變量修改實(shí)際上創(chuàng)建一個(gè)新的對(duì)象

引用計(jì)數(shù)機(jī)制

python每個(gè)東西都是對(duì)象,它的核心就是一個(gè)結(jié)構(gòu)體:pyObject

引用計(jì)數(shù)的優(yōu)點(diǎn)

簡(jiǎn)單
實(shí)時(shí)性:一旦沒有引用肤频,內(nèi)存就直接釋放叹括。處理回收內(nèi)存的時(shí)間分?jǐn)偟狡綍r(shí)。
缺點(diǎn)
維護(hù)引用計(jì)數(shù)消耗資源
循環(huán)引用帶來的案例沒有解決

list1= []
list2= []
list1.append(list2)
list2.append(list1)

list1與list2相互引用宵荒,如果不存在其他對(duì)象對(duì)它們的引用,list1與list2的引用計(jì)數(shù)也仍然為1净嘀,所占用的內(nèi)存永遠(yuǎn)無法被回收报咳,這將是致命的。 對(duì)于如今的強(qiáng)大硬件挖藏,缺點(diǎn)1尚可接受暑刃,但是循環(huán)引用導(dǎo)致內(nèi)存泄露,注定python還將引入新的回收機(jī)制:分代收集膜眠。

分代收集垃圾機(jī)制

第一岩臣, Python使用一種不同的鏈表來持續(xù)追蹤活躍的對(duì)象溜嗜,Python的內(nèi)部C代碼將其稱為零代鏈表(Generation Zero)。每次當(dāng)你創(chuàng)建一個(gè)什么對(duì)象或其他什么值的時(shí)候架谎,Python會(huì)將其添加到零代鏈表炸宵。
第二,隨后谷扣,Python會(huì)循環(huán)遍歷零代列表上的每個(gè)對(duì)象土全,找出列表中每個(gè)互相引用的對(duì)象,根據(jù)規(guī)則減掉其引用計(jì)數(shù)会涎。在這個(gè)過程中裹匙,Python會(huì)一個(gè)接一個(gè)的統(tǒng)計(jì)內(nèi)部引用的數(shù)量以防過早地釋放它們。
第三末秃,通過識(shí)別內(nèi)部引用概页,Python能夠減少許多零代鏈表循環(huán)引用的對(duì)象,這意味著回收器可以釋放它們并回收內(nèi)存了练慕。剩下的活躍對(duì)象則被移動(dòng)到一個(gè)新的鏈表:一代鏈表惰匙。
第四,周期性地從一個(gè)對(duì)象到另一個(gè)對(duì)象追蹤引用以確定對(duì)象是否還是活躍的贺待,正在被程序所使用的徽曲。清理完一代鏈表后,把活躍的對(duì)象麸塞,或者正在被程序使用的對(duì)象秃臣,移動(dòng)到二代鏈表中,最終在二代鏈表中清除數(shù)據(jù)哪工。這就是所謂的分代收集垃圾機(jī)制奥此。

Python中的GC閥值

1,Python什么時(shí)候會(huì)進(jìn)行這個(gè)標(biāo)記過程雁比?隨著你的程序運(yùn)行稚虎,Python解釋器保持對(duì)新創(chuàng)建的對(duì)象,以及因?yàn)橐糜?jì)數(shù)為零而被釋放掉的對(duì)象的追蹤偎捎。從理論上說蠢终,這兩個(gè)值應(yīng)該保持一致,因?yàn)槌绦蛐陆ǖ拿總€(gè)對(duì)象都應(yīng)該最終被釋放掉茴她。
2寻拂,當(dāng)然,事實(shí)并非如此丈牢。因?yàn)檠h(huán)引用的原因祭钉,并且因?yàn)槟愕某绦蚴褂昧艘恍┍绕渌麑?duì)象存在時(shí)間更長(zhǎng)的對(duì)象,從而被分配對(duì)象的計(jì)數(shù)值與被釋放對(duì)象的計(jì)數(shù)值之間的差異在逐漸增長(zhǎng)己沛。一旦這個(gè)差異累計(jì)超過某個(gè)閾值慌核,則Python的收集機(jī)制就啟動(dòng)了距境,并且觸發(fā)上邊所說到的零代算法,釋放“浮動(dòng)的垃圾”垮卓,并且將剩下的對(duì)象移動(dòng)到一代列表垫桂。
3,隨著時(shí)間的推移扒接,程序所使用的對(duì)象逐漸從零代列表移動(dòng)到一代列表伪货。而Python對(duì)于一代列表中對(duì)象的處理遵循同樣的方法,一旦被分配計(jì)數(shù)值與被釋放計(jì)數(shù)值累計(jì)到達(dá)一定閾值钾怔,Python會(huì)將剩下的活躍對(duì)象移動(dòng)到二代列表碱呼。
4,通過這種方法宗侦,你的代碼所長(zhǎng)期使用的對(duì)象愚臀,那些你的代碼持續(xù)訪問的活躍對(duì)象,會(huì)從零代鏈表轉(zhuǎn)移到一代再轉(zhuǎn)移到二代矾利。通過不同的閾值設(shè)置姑裂,Python可以在不同的時(shí)間間隔處理這些對(duì)象。Python處理零代最為頻繁男旗,其次是一代然后才是二代舶斧。

查看一個(gè)對(duì)象的引用計(jì)數(shù)
import sys
name = "xiaoka"
print(sys.getrefcount(name))
什么時(shí)候觸發(fā)垃圾回收機(jī)制

當(dāng)gc模塊的計(jì)數(shù)器達(dá)到閾值時(shí),自動(dòng)回收垃圾
手動(dòng)調(diào)用gc.collect(),手動(dòng)回收垃圾
程序退出的時(shí)候察皇,python解釋器會(huì)回收垃圾

引用計(jì)數(shù)的問題

引用計(jì)數(shù)增加

age=18#18引用計(jì)數(shù)增加1
x=age#18的引用計(jì)數(shù)為2
print(age)
print(x)

引用計(jì)數(shù)減少

age=19#18的引用次數(shù)為1
del x#18的引用值為0
變量值的三個(gè)特征

id反映了內(nèi)存地址
type表示數(shù)據(jù)類型

age=18
print(id(age))
print(type(age))
print(age)
總結(jié)

id相同茴厉,值一定相同。
值相同什荣,id值不一定相同矾缓。

x='name:zyc,age:18'
y='name:zyc,age:18'
print(id(x))
print(id(y))
2847698422856
2847698422856
is與==的區(qū)別

is表示id是否相同
==表示值是否相等

可變類型與不可變類型

可變類型: 值改變,id不變稻爬,證明就是在改變?cè)?br> 不可變類型:值改變嗜闻,id也變,證明根本不是在改變?cè)滴Τ莿?chuàng)建了新值琉雳,原值就是不可變類型

x=10#不可變類型
print(id(x))
x=11
print(id(x))


l=['a','b','c']#可變類型
print(id(l))
l[0]='A'
print(id(l))
print(l)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市友瘤,隨后出現(xiàn)的幾起案子咐吼,更是在濱河造成了極大的恐慌,老刑警劉巖商佑,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異厢塘,居然都是意外死亡茶没,警方通過查閱死者的電腦和手機(jī)肌幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抓半,“玉大人喂急,你說我怎么就攤上這事〉亚螅” “怎么了廊移?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)探入。 經(jīng)常有香客問我狡孔,道長(zhǎng),這世上最難降的妖魔是什么蜂嗽? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任苗膝,我火速辦了婚禮,結(jié)果婚禮上植旧,老公的妹妹穿的比我還像新娘辱揭。我一直安慰自己,他們只是感情好病附,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布问窃。 她就那樣靜靜地躺著,像睡著了一般完沪。 火紅的嫁衣襯著肌膚如雪域庇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天丽焊,我揣著相機(jī)與錄音较剃,去河邊找鬼。 笑死技健,一個(gè)胖子當(dāng)著我的面吹牛写穴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雌贱,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啊送,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了欣孤?” 一聲冷哼從身側(cè)響起馋没,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎降传,沒想到半個(gè)月后篷朵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年声旺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笔链。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腮猖,死狀恐怖鉴扫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澈缺,我是刑警寧澤坪创,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站姐赡,受9級(jí)特大地震影響莱预,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雏吭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一锁施、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杖们,春花似錦悉抵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孝治,卻和暖如春列粪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈飒。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工岂座, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杭措。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓费什,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親手素。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸳址,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 包(lib)、模塊(module) 在Python中泉懦,存在包和模塊兩個(gè)常見概念稿黍。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,805評(píng)論 0 27
  • 1.元類 1.1.1類也是對(duì)象 在大多數(shù)編程語言中,類就是一組用來描述如何生成一個(gè)對(duì)象的代碼段崩哩。在Python中這...
    TENG書閱讀 1,268評(píng)論 0 3
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,575評(píng)論 1 118
  • 馬云是怎么通過支付寶賺錢的巡球?網(wǎng)友:原來首富是這樣養(yǎng)成的 眾所周知,馬云是亞洲首富,那么他到底有多少錢...
    子陌帶你闖天下閱讀 138評(píng)論 0 0
  • 在學(xué)習(xí)他人github上demo項(xiàng)目時(shí)辕漂,遇到引入constraint-layout(約束布局)庫(kù)在Android...
    Qvechar閱讀 984評(píng)論 0 1