de概述:引用計數器為主,標記清除和分代回收為輔,+緩存機制。
什么方式實現的呢 ?是基于雙向鏈表。
1、引用計數器
2、標記清除
3、分代回收
4、緩存機制
5、Python的C源碼
環狀的雙向鏈表Refchain:狗鏈子。? ? refchain <--> lucky <-->?list等。在Python程序中創建的任何對象都會放在refchain雙向鏈表中。例如:name="lucky";age=18;list1=[1, "a"];代碼執行后會創建3個對象,都放到雙向鏈表中,也幫助我們維護了所有對象,得到這個雙向鏈表相當于得到了Python的所有對象。
創建的不同類型的對象,在放在雙向鏈表也會有所不同。不同的例如值和類型,均包括:上一個對象的指針next,下一個對象的指針prev,類型ob_type,值,引用個數ob_refcnt(默認1次)。當新增name2 = "lucky"。此時引用計數器+1 =2次。多個元素組成的對象例如:列表的話:存儲--items:元素,元素的個數: ob_size。
各數據類型內部結構體都封裝了哪些值?例如:float
1、float:data=3.14 =>?上一個:next,下一個:prev,??ob_type=float,? ?ob_refcnt=1,? ob_fval:3.14。
引用計數器:
v1=3.14; v2=999; v3=(1,2,3);
當Python程序在運行時,會根據數據類型的不同找到其對應的結構體,根據結構體中的字段進行創建相應的數據,然后將對象添加到refchain雙向鏈表中。在源碼中有兩個關鍵的結構體:pyobject(公共的那4個,每個對象都有)和PyVarObject(多個元素組成的對象)。每個對象都含有ob_refcnt就是引用計數器。當其他變量引用對象時,引用計數器就會發生變化。a=111;b=a;此時引用次數=2;?刪除則減1。
a = 111;b=a; del b =>刪除b變量,b對應對象引用計數器減1;如果繼續del a?則表示刪除a變量,引用計數減1。此時引用計數為0;當引用計數器為0時,意味著沒人在使用這個對象了,這個對象是垃圾,系統會默認垃圾回收。發生了兩件事:對象從refchain鏈表中移除;將對象銷毀內存歸還。(大體如此,還缺乏緩存機制)。引用次數=變量賦值次數。