国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Python 垃圾回收機(jī)制與原理解析

共 1010字,需瀏覽 3分鐘

 ·

2021-10-02 22:20


作者:錢魏Way

來(lái)源:https://www.biaodianfu.com/garbage-collector.html

大家好,我是安果!

Python 作為一門解釋型語(yǔ)言,以代碼簡(jiǎn)潔易懂著稱,我們可以直接對(duì)名稱賦值,而不必聲明類型,名稱類型的確定、內(nèi)存空間的分配與釋放都是由 Python 解釋器在運(yùn)行時(shí)進(jìn)行的

Python 這一自動(dòng)管理內(nèi)存功能極大的減小了程序員負(fù)擔(dān)

對(duì)于 Python 這種高級(jí)別的語(yǔ)言,開(kāi)發(fā)者完成可以不用關(guān)心其內(nèi)部的垃圾回收機(jī)制,相輔相成的通過(guò)學(xué)習(xí) Python 內(nèi)部的垃圾回收機(jī)制,并了解其原理,可以使得開(kāi)發(fā)者能夠更好的寫代碼,更加 Pythonista

目錄

  1. Python 內(nèi)存管理機(jī)制

  2. Python 的垃圾回收機(jī)制
????????2.1 引用計(jì)數(shù)(reference counting)
????????2.2 標(biāo)記清除(Mark and Sweep)

????????2.3 分代回收(Generational garbage collector)

  1. Python 中的 gc 模塊

Python內(nèi)存管理機(jī)制

在 Python 中,內(nèi)存管理涉及到一個(gè)包含所有 Python 對(duì)象和數(shù)據(jù)結(jié)構(gòu)的私有堆(heap)。這個(gè)私有堆的管理由內(nèi)部的 Python 內(nèi)存管理器(Python memory manager) 保證。Python 內(nèi)存管理器有不同的組件來(lái)處理各種動(dòng)態(tài)存儲(chǔ)管理方面的問(wèn)題,如共享、分割、預(yù)分配或緩存。

在最底層,一個(gè)原始內(nèi)存分配器通過(guò)與操作系統(tǒng)的內(nèi)存管理器交互,確保私有堆中有足夠的空間來(lái)存儲(chǔ)所有與 Python 相關(guān)的數(shù)據(jù)。在原始內(nèi)存分配器的基礎(chǔ)上,幾個(gè)對(duì)象特定的分配器在同一堆上運(yùn)行,并根據(jù)每種對(duì)象類型的特點(diǎn)實(shí)現(xiàn)不同的內(nèi)存管理策略。例如,整數(shù)對(duì)象在堆內(nèi)的管理方式不同于字符串、元組或字典,因?yàn)檎麛?shù)需要不同的存儲(chǔ)需求和速度與空間的權(quán)衡。因此,Python 內(nèi)存管理器將一些工作分配給對(duì)象特定分配器,但確保后者在私有堆的范圍內(nèi)運(yùn)行。

Python 堆內(nèi)存的管理是由解釋器來(lái)執(zhí)行,用戶對(duì)它沒(méi)有控制權(quán),即使他們經(jīng)常操作指向堆內(nèi)內(nèi)存塊的對(duì)象指針,理解這一點(diǎn)十分重要。

Python為了避免對(duì)于小對(duì)象(<=512bytes)出現(xiàn)數(shù)量過(guò)多的GC,導(dǎo)致的性能消耗。Python對(duì)于小對(duì)象采用子分配 (內(nèi)存池) 的方式進(jìn)行內(nèi)存塊的管理。對(duì)于大對(duì)象使用標(biāo)準(zhǔn)C中的allocator來(lái)分配內(nèi)存。

Python對(duì)于小對(duì)象的allocator由大到小分為三個(gè)層級(jí):arena、pool、block。

Block

Block是最小的一個(gè)層級(jí),每個(gè)block僅僅可以容納包含一個(gè)固定大小的Python Object。大小從8-512bytes,以8bytes為步長(zhǎng),分為64類不同的block。

Request in bytesSize of allocated blocksize class idx
1-880
9-16161
17-24242
25-32323
33-40404
41-48485
505-51251263

Pool

Pool具有相同大小的block組成集合稱為Pool。通常情況下,Pool的大小為4kb,與虛擬內(nèi)存頁(yè)的大小保存一致。限制Pool中block有固定的大小,有如下好處是: 當(dāng)一個(gè)對(duì)象在當(dāng)前Pool中的某個(gè)block被銷毀時(shí),Pool內(nèi)存管理可以將新生成的對(duì)象放入該block中。

/*?Pool?for?small?blocks.?*/
struct?pool_header?{
????union?{?block?*_padding;
????????????uint?count;?}?ref;??????????/*?number?of?allocated?blocks????*/
????block?*freeblock;???????????????????/*?pool's?free?list?head?????????*/
????struct?pool_header?*nextpool;???????/*?next?pool?of?this?size?class??*/
????struct?pool_header?*prevpool;???????/*?previous?pool???????""????????*/
????uint?arenaindex;????????????????????/*?index?into?arenas?of?base?adr?*/
????uint?szidx;?????????????????????????/*?block?size?class?index????????*/
????uint?nextoffset;????????????????????/*?bytes?to?virgin?block?????????*/
????uint?maxnextoffset;?????????????????/*?largest?valid?nextoffset??????*/
};

具有相同大小的Pool通過(guò)雙向鏈表來(lái)連接,sidx用來(lái)標(biāo)識(shí)Block的類型。arenaindex標(biāo)識(shí)當(dāng)前Pool屬于哪個(gè)Arena。ref.conut標(biāo)識(shí)當(dāng)前Pool使用了多少個(gè)Block。freeblock:標(biāo)識(shí)當(dāng)前Pools中可用block的指針。freeblock實(shí)際是單鏈表實(shí)現(xiàn),當(dāng)一塊block為空狀態(tài)時(shí),則將該block插入到freeblock鏈表的頭部。

每個(gè)Pool都有三個(gè)狀態(tài):

  • used:部分使用,即Pool不滿,也不為空
  • full:滿,即所有Pool中的Block都已被分配
  • empty:空, 即所有Pool中的Block都未被分配

usedpool為了很好的高效的管理Pool,Python額外使用了array,usedpool來(lái)管理。即如下圖所示,usedpool按序存儲(chǔ)著每個(gè)特性大小的Pool的頭指針,相同大小的Pool按照雙向鏈表來(lái)連接。當(dāng)分配新的內(nèi)存空間時(shí),創(chuàng)建一個(gè)特定大小的Pool,只需要使用usedpools找到頭指針,遍歷即可,當(dāng)沒(méi)有內(nèi)存空間時(shí),只需要在Pool的雙向鏈表的頭部插入新的Pool即可。

Arena

Pools和Blocks都不會(huì)直接去進(jìn)行內(nèi)存分配(allocate), Pools和Blocks會(huì)使用從arena那邊已經(jīng)分配好的內(nèi)存空間。Arena:是分配在堆上256kb的塊狀內(nèi)存,提供了64個(gè)Pool。

struct?arena_object?{
????uintptr_t?address;
????block*?pool_address;
????uint?nfreepools;
????uint?ntotalpools;
????struct?pool_header*?freepools;
????struct?arena_object*?nextarena;
????struct?arena_object*?prevarena;
};

所有的arenas也使用雙鏈表進(jìn)行連接(prevarena, nextarena字段). nfreepools和ntotalpools存儲(chǔ)著當(dāng)前可用pools的信息。freepools指針指向當(dāng)前可用的pools。arena結(jié)構(gòu)簡(jiǎn)單,職責(zé)即為按需給pools分配內(nèi)存,當(dāng)一個(gè)arena為空時(shí),則將該arena的內(nèi)存歸還給操作系統(tǒng)。

Python的垃圾回收機(jī)制

Python采用的是引用計(jì)數(shù)機(jī)制為主,標(biāo)記-清除和分代收集兩種機(jī)制為輔的策略。

引用計(jì)數(shù)(reference counting)

Python語(yǔ)言默認(rèn)采用的垃圾收集機(jī)制是“引用計(jì)數(shù)法 Reference Counting”,該算法最早George E. Collins在1960的時(shí)候首次提出,50年后的今天,該算法依然被很多編程語(yǔ)言使用。

引用計(jì)數(shù)法的原理是:每個(gè)對(duì)象維護(hù)一個(gè)ob_ref字段,用來(lái)記錄該對(duì)象當(dāng)前被引用的次數(shù),每當(dāng)新的引用指向該對(duì)象時(shí),它的引用計(jì)數(shù)ob_ref加1,每當(dāng)該對(duì)象的引用失效時(shí)計(jì)數(shù)ob_ref減1,一旦對(duì)象的引用計(jì)數(shù)為0,該對(duì)象立即被回收,對(duì)象占用的內(nèi)存空間將被釋放。

它的缺點(diǎn)是需要額外的空間維護(hù)引用計(jì)數(shù),這個(gè)問(wèn)題是其次的,不過(guò)最主要的問(wèn)題是它不能解決對(duì)象的“循環(huán)引用”,因此,也有很多語(yǔ)言比如Java并沒(méi)有采用該算法做來(lái)垃圾的收集機(jī)制。

Python中一切皆對(duì)象,也就是說(shuō),在Python中你用到的一切變量,本質(zhì)上都是類對(duì)象。實(shí)際上每一個(gè)對(duì)象的核心就是一個(gè)結(jié)構(gòu)體PyObject,它的內(nèi)部有一個(gè)引用計(jì)數(shù)器ob_refcnt,程序在運(yùn)行的過(guò)程中會(huì)實(shí)時(shí)的更新ob_refcnt的值,來(lái)反映引用當(dāng)前對(duì)象的名稱數(shù)量。當(dāng)某對(duì)象的引用計(jì)數(shù)值為0,說(shuō)明這個(gè)對(duì)象變成了垃圾,那么它會(huì)被回收掉,它所用的內(nèi)存也會(huì)被立即釋放掉。

typedef?struct?_object?{
????int?ob_refcnt;//引用計(jì)數(shù)
????struct?_typeobject?*ob_type;
}?PyObject;

導(dǎo)致引用計(jì)數(shù)+1的情況:

  • 對(duì)象被創(chuàng)建,例如a=23
  • 對(duì)象被引用,例如b=a
  • 對(duì)象被作為參數(shù),傳入到一個(gè)函數(shù)中,例如func(a)
  • 對(duì)象作為一個(gè)元素,存儲(chǔ)在容器中,例如list1=[a,a]

導(dǎo)致引用計(jì)數(shù)-1的情況

  • 對(duì)象的別名被顯式銷毀,例如del a
  • 對(duì)象的別名被賦予新的對(duì)象,例如a=24
  • 一個(gè)對(duì)象離開(kāi)它的作用域,例如f函數(shù)執(zhí)行完畢時(shí),func函數(shù)中的局部變量(全局變量不會(huì))
  • 對(duì)象所在的容器被銷毀,或從容器中刪除對(duì)象

我們可以通過(guò)sys包中的getrefcount()來(lái)獲取一個(gè)名稱所引用的對(duì)象當(dāng)前的引用計(jì)。sys.getrefcount()本身會(huì)使得引用計(jì)數(shù)加一.

循環(huán)引用

引用計(jì)數(shù)的另一個(gè)現(xiàn)象就是循環(huán)引用,相當(dāng)于有兩個(gè)對(duì)象a和b,其中a引用了b,b引用了a,這樣a和b的引用計(jì)數(shù)都為1,并且永遠(yuǎn)都不會(huì)為0,這就意味著這兩個(gè)對(duì)象永遠(yuǎn)都不會(huì)被回收了,這就是循環(huán)引用 , a與b形成了一個(gè)引用循環(huán) , 示例如下 :

a?=?[1,?2]??#?計(jì)數(shù)為?1
b?=?[2,?3]??#?計(jì)數(shù)為?1
a.append(b)??#?計(jì)數(shù)為?2
b.append(a)??#?計(jì)數(shù)為?2
del?a??#?計(jì)數(shù)為?1
del?b??#?計(jì)數(shù)為?1

除了上述兩個(gè)對(duì)象互相引用之外 , 還可以引用自身 :

list3?=?[1,2,3]
list3.append(list3)

循環(huán)引用導(dǎo)致變量計(jì)數(shù)永不為 0,造成引用計(jì)數(shù)無(wú)法將其刪除。

引用計(jì)數(shù)法有其明顯的優(yōu)點(diǎn),如高效、實(shí)現(xiàn)邏輯簡(jiǎn)單、具備實(shí)時(shí)性,一旦一個(gè)對(duì)象的引用計(jì)數(shù)歸零,內(nèi)存就直接釋放了。不用像其他機(jī)制等到特定時(shí)機(jī)。將垃圾回收隨機(jī)分配到運(yùn)行的階段,處理回收內(nèi)存的時(shí)間分?jǐn)偟搅似綍r(shí),正常程序的運(yùn)行比較平穩(wěn)。引用計(jì)數(shù)也存在著一些缺點(diǎn):

  • 邏輯簡(jiǎn)單,但實(shí)現(xiàn)有些麻煩。每個(gè)對(duì)象需要分配單獨(dú)的空間來(lái)統(tǒng)計(jì)引用計(jì)數(shù),這無(wú)形中加大的空間的負(fù)擔(dān),并且需要對(duì)引用計(jì)數(shù)進(jìn)行維護(hù),在維護(hù)的時(shí)候很容易會(huì)出錯(cuò)。
  • 在一些場(chǎng)景下,可能會(huì)比較慢。正常來(lái)說(shuō)垃圾回收會(huì)比較平穩(wěn)運(yùn)行,但是當(dāng)需要釋放一個(gè)大的對(duì)象時(shí),比如字典,需要對(duì)引用的所有對(duì)象循環(huán)嵌套調(diào)用,從而可能會(huì)花費(fèi)比較長(zhǎng)的時(shí)間。
  • 循環(huán)引用。這將是引用計(jì)數(shù)的致命傷,引用計(jì)數(shù)對(duì)此是無(wú)解的,因此必須要使用其它的垃圾回收算法對(duì)其進(jìn)行補(bǔ)充。

也就是說(shuō),Python 的垃圾回收機(jī)制,很大一部分是為了處理可能產(chǎn)生的循環(huán)引用,是對(duì)引用計(jì)數(shù)的補(bǔ)充。

標(biāo)記清除(Mark and Sweep)

Python采用了“標(biāo)記-清除”(Mark and Sweep)算法,解決容器對(duì)象可能產(chǎn)生的循環(huán)引用問(wèn)題。(注意,只有容器對(duì)象才會(huì)產(chǎn)生循環(huán)引用的情況,比如列表、字典、用戶自定義類的對(duì)象、元組等。而像數(shù)字,字符串這類簡(jiǎn)單類型不會(huì)出現(xiàn)循環(huán)引用。作為一種優(yōu)化策略,對(duì)于只包含簡(jiǎn)單類型的元組也不在標(biāo)記清除算法的考慮之列)

跟其名稱一樣,該算法在進(jìn)行垃圾回收時(shí)分成了兩步,分別是:

  • 標(biāo)記階段,遍歷所有的對(duì)象,如果是可達(dá)的(reachable),也就是還有對(duì)象引用它,那么就標(biāo)記該對(duì)象為可達(dá);
  • 清除階段,再次遍歷對(duì)象,如果發(fā)現(xiàn)某個(gè)對(duì)象沒(méi)有標(biāo)記為可達(dá),則就將其回收。

對(duì)象之間會(huì)通過(guò)引用(指針)連在一起,構(gòu)成一個(gè)有向圖,對(duì)象構(gòu)成這個(gè)有向圖的節(jié)點(diǎn),而引用關(guān)系構(gòu)成這個(gè)有向圖的邊。從root object出發(fā),沿著有向邊遍歷對(duì)象,可達(dá)的(reachable)對(duì)象標(biāo)記為活動(dòng)對(duì)象,不可達(dá)(unreachable)的對(duì)象就是要被清除的非活動(dòng)對(duì)象。所謂 root object,就是一些全局變量、調(diào)用棧、寄存器,這些對(duì)象是不可被刪除的。

我們把小黑圈視為 root object,從小黑圈出發(fā),對(duì)象 1 可達(dá),那么它將被標(biāo)記,對(duì)象 2、3可間接可達(dá)也會(huì)被標(biāo)記,而 4 和 5 不可達(dá),那么 1、2、3 就是活動(dòng)對(duì)象,4 和 5 是非活動(dòng)對(duì)象會(huì)被 GC 回收。

如下圖所示,在標(biāo)記清除算法中,為了追蹤容器對(duì)象,需要每個(gè)容器對(duì)象維護(hù)兩個(gè)額外的指針,用來(lái)將容器對(duì)象組成一個(gè)雙端鏈表,指針?lè)謩e指向前后兩個(gè)容器對(duì)象,方便插入和刪除操作。Python解釋器(Cpython)維護(hù)了兩個(gè)這樣的雙端鏈表,一個(gè)鏈表存放著需要被掃描的容器對(duì)象,另一個(gè)鏈表存放著臨時(shí)不可達(dá)對(duì)象。

在圖中,這兩個(gè)鏈表分別被命名為“Object to Scan”和“Unreachable”。圖中例子是這么一個(gè)情況:link1,link2,link3組成了一個(gè)引用環(huán),同時(shí)link1還被一個(gè)變量A(其實(shí)這里稱為名稱A更好)引用。link4自引用,也構(gòu)成了一個(gè)引用環(huán)。

從圖中我們還可以看到,每一個(gè)節(jié)點(diǎn)除了有一個(gè)記錄當(dāng)前引用計(jì)數(shù)的變量ref_count還有一個(gè)gc_ref變量,這個(gè)gc_ref是ref_count的一個(gè)副本,所以初始值為ref_count的大小。

gc啟動(dòng)的時(shí)候,會(huì)逐個(gè)遍歷“Object to Scan”鏈表中的容器對(duì)象,并且將當(dāng)前對(duì)象所引用的所有對(duì)象的gc_ref減一。(掃描到link1的時(shí)候,由于link1引用了link2,所以會(huì)將link2的gc_ref減一,接著掃描link2,由于link2引用了link3,所以會(huì)將link3的gc_ref減一…..)像這樣將“Objects to Scan”鏈表中的所有對(duì)象考察一遍之后,兩個(gè)鏈表中的對(duì)象的ref_count和gc_ref的情況如下圖所示。這一步操作就相當(dāng)于解除了循環(huán)引用對(duì)引用計(jì)數(shù)的影響。

接著,gc會(huì)再次掃描所有的容器對(duì)象,如果對(duì)象的gc_ref值為0,那么這個(gè)對(duì)象就被標(biāo)記為GC_TENTATIVELY_UNREACHABLE,并且被移至“Unreachable”鏈表中。下圖中的link3和link4就是這樣一種情況。

如果對(duì)象的gc_ref不為0,那么這個(gè)對(duì)象就會(huì)被標(biāo)記為GC_REACHABLE。同時(shí)當(dāng)gc發(fā)現(xiàn)有一個(gè)節(jié)點(diǎn)是可達(dá)的,那么他會(huì)遞歸式的將從該節(jié)點(diǎn)出發(fā)可以到達(dá)的所有節(jié)點(diǎn)標(biāo)記為GC_REACHABLE,這就是下圖中l(wèi)ink2和link3所碰到的情形。

除了將所有可達(dá)節(jié)點(diǎn)標(biāo)記為GC_REACHABLE之外,如果該節(jié)點(diǎn)當(dāng)前在“Unreachable”鏈表中的話,還需要將其移回到“Object to Scan”鏈表中,下圖就是link3移回之后的情形。

第二次遍歷的所有對(duì)象都遍歷完成之后,存在于“Unreachable”鏈表中的對(duì)象就是真正需要被釋放的對(duì)象。如上圖所示,此時(shí)link4存在于Unreachable鏈表中,gc隨即釋放之。

上面描述的垃圾回收的階段,會(huì)暫停整個(gè)應(yīng)用程序,等待標(biāo)記清除結(jié)束后才會(huì)恢復(fù)應(yīng)用程序的運(yùn)行。

標(biāo)記清除的優(yōu)點(diǎn)在于可以解決循環(huán)引用的問(wèn)題,并且在整個(gè)算法執(zhí)行的過(guò)程中沒(méi)有額外的開(kāi)銷。缺點(diǎn)在于當(dāng)執(zhí)行標(biāo)記清除時(shí)正常的程序?qū)?huì)被阻塞。另外一個(gè)缺點(diǎn)在于,標(biāo)記清除算法在執(zhí)行很多次數(shù)后,程序的堆空間會(huì)產(chǎn)生一些小的內(nèi)存碎片。

分代回收(Generational garbage collector)

分代回收技術(shù)是上個(gè)世紀(jì)80年代初發(fā)展起來(lái)的一種垃圾回收機(jī)制,也是Java 垃圾回收的核心算法。分代回收是基于這樣的一個(gè)統(tǒng)計(jì)事實(shí),對(duì)于程序,存在一定比例的內(nèi)存塊的生存周期比較短;而剩下的內(nèi)存塊,生存周期會(huì)比較長(zhǎng),甚至?xí)某绦蜷_(kāi)始一直持續(xù)到程序結(jié)束。

生存期較短對(duì)象的比例通常在 80%~90% 之間。因此,簡(jiǎn)單地認(rèn)為:對(duì)象存在時(shí)間越長(zhǎng),越可能不是垃圾,應(yīng)該越少去收集。這樣在執(zhí)行標(biāo)記-清除算法時(shí)可以有效減小遍歷的對(duì)象數(shù),從而提高垃圾回收的速度,是一種以空間換時(shí)間的方法策略。

  • Python 將所有的對(duì)象分為 0,1,2 三代;
  • 所有的新建對(duì)象都是 0 代對(duì)象;
  • 當(dāng)某一代對(duì)象經(jīng)歷過(guò)垃圾回收,依然存活,就被歸入下一代對(duì)象。

那么,按什么標(biāo)準(zhǔn)劃分對(duì)象呢?是否隨機(jī)將一個(gè)對(duì)象劃分到某個(gè)代即可呢?答案是否定的。實(shí)際上,對(duì)象分代里頭也是有不少學(xué)問(wèn)的,好的劃分標(biāo)準(zhǔn)可顯著提升垃圾回收的效率。

Python 內(nèi)部根據(jù)對(duì)象存活時(shí)間,將對(duì)象分為 3 代,每個(gè)代都由一個(gè) gc_generation 結(jié)構(gòu)體來(lái)維護(hù)(定義于 Include/internal/mem.h):

struct?gc_generation?{?
????PyGC_Head?head;?
????int?threshold;?/*?collection?threshold?*/?
????int?count;?/*?count?of?allocations?or?collections?of?younger?generations?*/?
};

其中:

  • head,可收集對(duì)象鏈表頭部,代中的對(duì)象通過(guò)該鏈表維護(hù)
  • threshold,僅當(dāng) count 超過(guò)本閥值時(shí),Python 垃圾回收操作才會(huì)掃描本代對(duì)象
  • count,計(jì)數(shù)器,不同代統(tǒng)計(jì)項(xiàng)目不一樣

Python 虛擬機(jī)運(yùn)行時(shí)狀態(tài)由 Include/internal/pystate.h 中的 pyruntimestate 結(jié)構(gòu)體表示,它內(nèi)部有一個(gè) _gc_runtime_state ( Include/internal/mem.h )結(jié)構(gòu)體,保存 GC 狀態(tài)信息,包括 3 個(gè)對(duì)象代。這 3 個(gè)代,在 GC 模塊( Modules/gcmodule.c ) _PyGC_Initialize 函數(shù)中初始化:

struct?gc_generation?generations[NUM_GENERATIONS]?=?{
????/*?PyGC_Head,?threshold,?count?*/
????{{{_GEN_HEAD(0),?_GEN_HEAD(0),?0}},?700?0},
????{{{_GEN_HEAD(1),?_GEN_HEAD(1),?0}},?10,?0},
????{{{_GEN_HEAD(2),?_GEN_HEAD(2),?0}},?10,?0},
};

為方便討論,我們將這 3 個(gè)代分別稱為:初生代、中生代 以及 老生代。當(dāng)這 3 個(gè)代初始化完畢后,對(duì)應(yīng)的 gc_generation 數(shù)組大概是這樣的:

每個(gè) gc_generation 結(jié)構(gòu)體鏈表頭節(jié)點(diǎn)都指向自己,換句話說(shuō)每個(gè)可收集對(duì)象鏈表一開(kāi)始都是空的,計(jì)數(shù)器字段 count 都被初始化為 0,而閥值字段 threshold 則有各自的策略。這些策略如何理解呢?

  • Python 調(diào)用 _PyObject_GC_Alloc 為需要跟蹤的對(duì)象分配內(nèi)存時(shí),該函數(shù)將初生代 count 計(jì)數(shù)器加1,隨后對(duì)象將接入初生代對(duì)象鏈表,當(dāng) Python 調(diào)用 PyObject_GC_Del 釋放垃圾對(duì)象內(nèi)存時(shí),該函數(shù)將初生代 count 計(jì)數(shù)器,1,_PyObject_GC_Alloc 自增 count 后如果超過(guò)閥值(700),將調(diào)用 collect_generations 執(zhí)行一次垃圾回收( GC )。
  • collect_generations 函數(shù)從老生代開(kāi)始,逐個(gè)遍歷每個(gè)生代,找出需要執(zhí)行回收操作(,count>threshold )的最老生代。隨后調(diào)用 collect_with_callback 函數(shù)開(kāi)始回收該生代,而該函數(shù)最終調(diào)用 collect 函數(shù)。
  • collect 函數(shù)處理某個(gè)生代時(shí),先將比它年輕的生代計(jì)數(shù)器 count 重置為 0,然后將它們的對(duì)象鏈表移除,與自己的拼接在一起后執(zhí)行 GC 算法,最后將下一個(gè)生代計(jì)數(shù)器加1。

于是:

  • 系統(tǒng)每新增 701 個(gè)需要 GC 的對(duì)象,Python 就執(zhí)行一次 GC 操作
  • 每次 GC 操作需要處理的生代可能是不同的,由 count 和 threshold 共同決定
  • 某個(gè)生代需要執(zhí)行 GC ( count>hreshold ),在它前面的所有年輕生代也同時(shí)執(zhí)行 GC
  • 對(duì)多個(gè)代執(zhí)行 GC,Python 將它們的對(duì)象鏈表拼接在一起,一次性處理
  • GC 執(zhí)行完畢后,count 清零,而后一個(gè)生代 count 加 1

下面是一個(gè)簡(jiǎn)單的例子:初生代觸發(fā) GC 操作,Python 執(zhí)行 collect_generations 函數(shù)。它找出了達(dá)到閥值的最老生代是中生代,因此調(diào)用 collection_with_callback(1),1 是中生代在數(shù)組中的下標(biāo)。

collection_with_callback(1) 最終執(zhí)調(diào)用 collect(1) ,它先將后一個(gè)生代計(jì)數(shù)器加一;然后將本生代以及前面所有年輕生代計(jì)數(shù)器重置為零;最后調(diào)用 gc_list_merge 將這幾個(gè)可回收對(duì)象鏈表合并在一起:

最后,collect 函數(shù)執(zhí)行標(biāo)記清除算法,對(duì)合并后的鏈表進(jìn)行垃圾回收。

這就是分代回收機(jī)制的全部秘密,它看似復(fù)雜,但只需略加總結(jié)就可以得到幾條直白的策略:

  • 每新增 701 個(gè)需要 GC 的對(duì)象,觸發(fā)一次新生代 GC
  • 每執(zhí)行 11 次新生代 GC ,觸發(fā)一次中生代 GC
  • 每執(zhí)行 11 次中生代 GC ,觸發(fā)一次老生代 GC (老生代 GC 還受其他策略影響,頻率更低)
  • 執(zhí)行某個(gè)生代 GC 前,年輕生代對(duì)象鏈表也移入該代,一起 GC
  • 一個(gè)對(duì)象創(chuàng)建后,隨著時(shí)間推移將被逐步移入老生代,回收頻率逐漸降低

Python 中的 gc 模塊

gc 模塊是我們?cè)赑ython中進(jìn)行內(nèi)存管理的接口,一般情況Python程序員都不用關(guān)心自己程序的內(nèi)存管理問(wèn)題,但是有的時(shí)候,比如發(fā)現(xiàn)自己程序存在內(nèi)存泄露,就可能需要用到gc模塊的接口來(lái)排查問(wèn)題。

有的 Python 系統(tǒng)會(huì)關(guān)閉自動(dòng)垃圾回收,程序自己判斷回收的時(shí)機(jī),據(jù)說(shuō) instagram 的系統(tǒng)就是這樣做的,整體運(yùn)行效率提高了10%。

常用函數(shù):

  • set_debug(flags) :設(shè)置gc的debug日志,一般設(shè)置為gc.DEBUG_LEAK可以看到內(nèi)存泄漏的對(duì)象。
  • collect([generation]) :執(zhí)行垃圾回收。會(huì)將那些有循環(huán)引用的對(duì)象給回收了。這個(gè)函數(shù)可以傳遞參數(shù),0代表只回收第0代的的垃圾對(duì)象、1代表回收第0代和第1代的對(duì)象,2代表回收第0、1、2代的對(duì)象。如果不傳參數(shù),那么會(huì)使用2作為默認(rèn)參數(shù)。
  • get_threshold() :獲取gc模塊執(zhí)行垃圾回收的閾值。返回的是個(gè)元組,第0個(gè)是零代的閾值,第1個(gè)是1代的閾值,第2個(gè)是2代的閾值。
  • set_threshold(threshold0[, threshold1[, threshold2]) :設(shè)置執(zhí)行垃圾回收的閾值。
  • get_count() :獲取當(dāng)前自動(dòng)執(zhí)行垃圾回收的計(jì)數(shù)器。返回一個(gè)元組。第0個(gè)是零代的垃圾對(duì)象的數(shù)量,第1個(gè)是零代鏈表遍歷的次數(shù),第2個(gè)是1代鏈表遍歷的次數(shù)。

參考鏈接:

  • 聊聊Python內(nèi)存管理 (https://andrewpqc.github.io/2018/10/08/python-memory-management/)
  • gc — 垃圾回收器接口 (https://docs.python.org/zh-cn/3/library/gc.html)


還不過(guò)癮?試試它們




硬肝一次 Python 微服務(wù)是一種什么體驗(yàn)?

Postman 如何調(diào)試加密接口?

5 分鐘,使用內(nèi)網(wǎng)穿透快速實(shí)現(xiàn)遠(yuǎn)程桌面

聊聊 Jmeter 如何并發(fā)執(zhí)行 Python 腳本

聊聊 PC 端自動(dòng)化最佳方案 - Pywinauto


如果你覺(jué)得本文有幫助
歡迎轉(zhuǎn)發(fā)分享,點(diǎn)擊關(guān)注AirPython
瀏覽 31
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美一级特黄AAAAAA片在线视频| 美女91网站色| 苍井空精毛片精品久久久| 美妇肥臀一区二区三区-久久99精品国| 熟女网址| 北条麻妃日B视频| 免费无码婬片AAAA片老婦| 成人性爱免费网站| 亚洲高清毛片一区二区| 中文字幕精品综合| 精品一区二区三区蜜桃臀www| A无码| 丁香花小说完整视频免费观看| 国产黄色片视频| 青青草原在线免费| 中文字幕精品视频在线| 在线观看中文字幕亚洲| 特级特黄A级高潮播放| 中文字幕在线免费观看| 91麻豆精品国产91久久久熟女 | 青草免费视频| 在线视频第一页| 男女无码视频| 亚洲综合色色| 北条麻妃在线中文字幕| 在线观看内射视频| 天天搞天天干| 人人摸在线视频| 成人高清在线| 亚洲视频99| 天天综合字幕一区二区| 一区二区三区国产视频| 国产日本欧美韩国久久久久| 国产黄色免费看| 亚洲乱淫| 91成人免费电影| 午夜福利在线视频| 中文字幕av久久爽Av| 一级成人毛片| 国产嫩苞又嫩又紧AV在线| 91精品成人电影| 综合AV在线| 国产精品无码不卡| 亚洲秘无码一区二区| 韩国一区二区三区在线观看 | 亚洲www| 影音先锋一区二区三区| 国产精品h| 国产又爽又黄免费网站在线观看| 西西444WWW无码大胆| 国产女人18毛片水真多1| 亚洲视频免费在线播放| 国产精品自拍偷拍| 国产伦子伦一级A片在线| 青春草在线免费视频| 91精品婷婷国产综合久久蝌蚪| 午夜专区| 国产第五页| 欧美爱爱网站| 揉BBB搡BBB搡BBB| 国产精品色情A级毛片| 中文字幕亚洲观看| 伊人婷婷久久| 波多野结衣Av在线| 操碰人人操| 九九色在线视频| 欧美大鸡| 婷婷六区| 另类视频区| 四季AV一区二区凹凸懂色桃花 | 岛国无码在线| 91人妻人人爽| 无码人妻丰满熟妇区毛片视频| а√最新版天堂中文在线| 91无码精品国产| 亚洲福利视频网| 一区在线观看视频| 在线免费观看黄色电影| www.五月婷婷| 91在线无码精品秘入口动作| 丁香五月天视频| 色诱av| 免费在线黄色电影| 在线中文字幕视频| 国产精品电影| 天天干天天干天天| 神马午夜福利| 热热毛片| 综合欧美国产视频二区| 久久久精品电影91| 黄片视频链接| 久久露脸国语精品国产91| 91丨九色丨蝌蚪丨对白| 日韩欧美偷拍| 在线观看中文字幕无码| 中文字幕一本道| 日韩在线网址| 91看片看婬黄大片女跟女| 日韩十八禁网站| 西西人体44www大胆无码| 欧美色插| 色色大香蕉| 各种妇女撒尿mm毛免费网站| 中文在线永久免费观看| 五月丁香成人网| 日本无码视频在线观看| 亚洲高清免费视频| 五月丁香在线| 撸撸视频| 亚洲va欧美va天堂v国产综合 | 久久小视频| 四川w搡BBB搡wBBB搡| 青青国产| 亚洲一区| 四虎在线视频观看96| 亚洲国产成人精品激情在线| 亚洲AV永久无码精品国产精| 午夜传媒一区二区三区| 影音先锋成人AV资源| 大香蕉网伊人在线| 不卡三区| av资源网站| 九九成人电影| 久久影音先锋| 北条麻妃无码| 99美女精品视频| 激情无码av| 天天草天天日| 草草影院CCYYCOM屁屁影院合集限制影院| 黄色A片免费视频| 国产老熟女久久久| 91在线无码精品秘国产| 国产免费麻豆| 精品国产乱子伦一区二区三区最新章| 99热这里| 在线草| 2017天天射| 日韩在线99| 最近最经典中文MV字幕| 中文字幕丰满熟妇人妻| 青青草视频| 人人干人人澡| 亚洲AV无码乱码精品| 亚洲国产高清在线观看视频| 你懂的在线视频观看| 中日韩黄色视频| 成人免费网站在线观看| 亚洲天堂日本| 97视频在线免费观看| 亚洲中文字幕在线免费观看视频| 国产精品9999| 黄色电影毛片| 69国产成人精品二区| 成人黄A片免费| 午夜做爱视频| 91精品大屁股白浆自慰久久久| 欧美精品网站| 免费av在线| 国产欧美一区二区三区国产幕精品| 黄色网址在线观看视频| 欧美性猛交ⅩXXX无码视频| 香蕉视频成人在线| 少妇熟女一区| 午夜精品无码| 韩国精品久久久| 日本AA视频| 91无码精品国产AⅤ| 青草青草视频| 亚洲AV成人无码精品直播在线| 亚洲成人精品在线观看| 男女啪啪网站| 亚洲一区自拍| 国产最新av| 亚洲免费黄片| 亚洲AV无码成人精品涩涩麻豆| 成人在线视频观看| 日逼综合| 国产无遮挡又黄又爽又色学生软件 | 国产一级在线| 欧美成人电影| 无码人妻一区二区三一区免费n狂飙| 操逼二区| A级毛片在线观看| 日韩人妻精品无码久久| 国产精品秘入口18禁网站| 高清无码高潮| 国产性爱自拍视频| 秋霞中文字幕| 成年人毛片| 国产青娱乐在线视频| PORNY九色视频9l自拍| 亚洲成人性爱视频| 一卡二卡无码| 在线观看国产| 国产AV一卡| 三级无码在线观看| 精品免费国产一区二区三区四区| 无码久久| 日韩中文字幕永久| 怡春院在线视频| 亚洲成人无码一区| 成人黄色电影在线观看| 中国一级黄色A片| av天堂资源| 日本一区二区三区在线观看网站| 荫蒂添出高潮A片视频| 中文字幕成人| aaa精品视频| 亚洲日韩三级| 欧美老熟妇乱大交XXXXX| 久久久精品| 日本少妇高潮喷水XXXXXXX| 亚洲欧美日韩动漫| 三级片网站大全| 亚洲中文字幕电影| 男女一区| 99热在线只有精品| 91av成人| 亚洲乱码国产乱码精品天美传媒 | 欧亚一区二区| 国产经典午夜福利视频合集| 久久亚洲成人| 国产精品可站18| 色色综合热| 天堂а√在线中文在线新版| caobi视频| 一道本视频在线| 成人av免费观看| 91亚洲国产AⅤ精品一区二区| 中文字幕三区| 亚洲免费观看A∨中文| 天天草天天撸| 成人精品午夜无码免费| 北条麻妃无码精品AV怎么看| 亚洲成人av在线播放| 日韩成人一区二区| 操逼小电影| 91视频美女| 亚洲一级视频在线观看| 一级黄色电影网站| 欧美黄色a片| 日本成人电影一区二区三区| 夜色福利视频| 国产日韩欧美综合精品在线观看 | 国产高清做爱| 久久久久亚洲AV无码专区| 亚洲色图另类| 大香蕉在线视频99| 久久av网站| 97精品人妻一区二区三区在线| h无码| 不卡AV在线播放| 不卡日韩| 乱婬妺妺躁爽A片| 久久精品国产AV一区二区三区| 日本爱爱网址| 日韩一级免费视频| 亚洲中文视频免费| 内射婷婷| 内射少妇18| 久碰人妻人妻人妻| 日韩精品一区二区在线观看| 中文字幕av久久波多野结| 8x8拨牐拨牐拨牐永久免费| 日韩熟妇无码中文字慕| 婷婷久久综合久色| 青青国产在线观看| 久久久久电影| 婷婷五月天激情俺来也| 影音先锋成人在线视频| 黄色激情视频网站| 亚洲国产成人自拍| 99热这里只有精品7| 五十路在线视频| 亚洲成人无码片| 日皮视频在线免费观看| 俺来也俺去也| 日韩欧美天堂| 91女人18片女毛片60分钟| 最新国产激情视频| 欧美熟妇一区二区| 精品人无码一区二区三区下载| 日韩啪啪片| 一区二区三区四区精品视频| 国产无码专区| 日本一区二区在线视频| 成人做爰黄AAA片免费直播岛国| 国产色秘乱码一区二区三区| 九一av| 免费毛片基地| 先锋资源日韩| 永久免费看片视频| 国产男女av| 狠狠欧美| 无码性爱视频| 亚洲精品无码免费| 操逼网站免费观看| 99色综合网| 超碰人人在线观看| 日韩三级| 国产迷奸在线| 黄色大片在线免费观看| 免费无码国产在线| 五月在线| 高潮视频在线| 亚洲无码视频一区二区| 青草碰| 福利无码| 九九无码| 精品人妻一区二区免费蜜桃| 草视频| 特级西西444www| 97人妻在线视频| 亚洲高清无码播放| 日本欧美一级| 亚洲日本三级片| 3d动漫精品一区二区三区在线观看 | 无码内射视频| 九九热视频在线| 国产乱码一区二区三区四区在线 | 日韩婬乱片A片AAA真人视频| 国产96在线亚洲| 亚洲在线成人视频| 在线视频亚洲| 夜夜干天天操| 91视频免费网站| 无码秘蜜桃一区二区三区| 操逼亚洲| 久久依人大香蕉| 亚洲永久视频| www.伊人网| 亚洲性爱一级片| 日本少妇久久| 欧美Aⅴ| 中国1级毛片| 亚洲日韩欧美一区二区天天天| 在线免费观看黄色视频| 日韩欧美人妻| 91香蕉| 国产成人精品无码区在线| 国产精品免费在线| 蜜臀AV网| www.日韩| 91鲁| 亚洲一区| 日韩无码精品一区二区三区| 青青操逼| 777777国产7777777| 欧美色色色| 激情综合网站| 国产亲子乱婬一级A片| 欧美黄色精品| 专业操美女视频网站| 成人日皮视频| 91精品婷婷国产| 综合大香蕉| 国产主播精品| 嫩BBB槡BBBB槡BBBB视频-百度 | 青娱乐精品在线视频| 亚洲天堂在线视频观看| 久久久久999| 99这里只有精品| 国产91视频在线观看| 国产AV一区二区三区| 欧洲性爱视频| 中文字幕不卡AV在线观看| 成人AV十八亚洲二区| 少妇无码一区| 国产精品93333333| 51精品国产午夜福利| 国产精品卡一卡二| 91黄网站在线观看| 国产爱搞| 成人福利电影| 欧美在线视频99| 天天草天天撸| 日韩中字无码黄片| 婷婷色AV| 久久九九国产精品怡红院| 尤物免费视频| 国产一级片免费视频| 久久一道本| 国产口爆视频| 黄片视频在线观看| 91在线无码精品秘入口男同| 欧美性BBwBBwBBwHD| 超碰福利在线| 一级无码毛片| 亚洲无码性爱视频| 亚洲成人福利在线| 亚洲va中文字幕| 先锋成人影音| 五月激情网站| 亚洲人成人无码.www粉色| 五十路在线| 日韩精品免费在线观看| 色欧美亚洲| 欧美成人三级在线| 7777精品伊人久久7777| 苍井空二区| 在线观看日韩视频| 久久性爱视频| 熟睡侵犯の奶水授乳在线| 开心五月婷| av免费播放| 日韩a在线观看| 狠狠久久| 18岁成人毛片| igao在线观看| 爱爱无码| 欧美精品亚洲| 欧美亚洲系列| 久久久偷拍| 国产精品999999| 18禁黄色免费网站| 色色视频免费看| 中文在线a√在线8| 操穴网| 中文字幕无码在线视频| 成人黄色无码视频| 法国《少女日记》电影| 婷婷狠狠干| 人人人人人妻| 91中文在线| 北条麻妃91人妻互换| 人妻日韩精品中文字幕| 9999国产精品| 一区二区中文字幕| 日韩A电影| 日韩AV电影网站| 亚洲aaa| 青青草91视频| 中文字幕H| 97中文字幕在线| 大香蕉伊人网在线| 青春草在线| 亚洲午夜精品成人毛片| 成人在线18禁| 成人在线中文字幕| 欧美黄色性爱| 少妇搡BBBB搡BBB搡打电话| 日韩一级黄色| 性爱黄色视频| 欧美日韩h| 51妺妺嘿嘿午夜成人A片| 欧美精品性爱视频| 成人无码欧美大片免费看| 一级A片60分钟免费看| 无码入口| 精品视频中文字幕| 色婷婷基地| 免费无码在线播放| 亚洲欧洲自拍| 自拍偷拍第一页| 亚洲精品A| 99视频+国产日韩欧美| 五十路在线| 免费黄片视频在线观看| 国产伦精品一级A片视频夜夜| 91熟女视频| 成人无码一区二区三区| 久久人体视频| 日韩AV在线直播| 一级大片| 北条麻妃JUX-869无码播放| 日韩无码高清网站| 女人的天堂AV| 又黄又爽无遮挡| 99热99re6国产线播放| 国产香蕉视频| 免费a视频在线观看| 日韩av第一页| 亚洲欧美日韩无码| 人人爱人人插| 在线亚洲欧美| 男女黄色免费网站| 国产人国产视频成人免费观看…| 无码高清免费| 草榴在线视频| 性欧美日韩| 日本操逼网| AV不卡在线| 久久91精品| 国产一区在线播放| 中文字幕在线观看免费视频| 日韩一区二区在线视频| 国产乱╳╳AⅤ毛片| 人妻超碰在线| 成人在线视频免费| 777视频在线观看| 狼友视频免费在线观看| 91日日| 中文字幕日韩欧美| av天天看| 国产91探花精品一区二区| 日韩美女做爱| 免费a在线| 99热在线观看精品免费| 日本中文无码视频| 超碰二区| 岛国AV在线| 精品一二三| 熟女老阿V8888AV| 99精品国产一区二区| 亚洲天堂在线视频| 亚洲无码视频免费在线观看| 无码人妻丰满熟妇区蜜桃| 91丨PORN首页| 安徽少妇搡bbw搡bbbb| 黄页网站在线免费观看| 色欲一区二区| 欧美成人电影在线观看| 先锋影音亚洲AV每日资源网站| 一级无码毛片| 图片区小说区区亚洲五月| 北京熟妇搡BBBB搡BBBB| 亚洲婷婷视频| 日日夜夜天天操| 中文字幕h| 一道本无码在线| 人人干人人上| 欧美二区视频| 精品人妻中文字幕视频| 人人看人人摸人人操| 国产一级AV国产免费| 高清无码第一页| 欧一美一婬一伦一区?| 中文字幕网在线| 久草超碰| 久久国产精品久久| 中文字幕第10页| 亲子伦一区二区三区观看方式| 3D动漫精选啪啪一期二期三期| 91性爱| 午夜成人在线| 无码一区二区三区四区五区六区| 欧美日韩在线视频一区| 亚洲播播在线视频| 丰满人妻一区二区免费看| 九九偷拍视频| 夜夜高潮夜夜爽| 91AV视频在线| 国产三级黄色| 蜜桃黄色视频| 色欧美亚洲| 色婷婷视频在线观看| 国产中文字幕在线视频| 久久亚洲免费视频| 黄色一级片免费观看| 亚洲一二三四区| 97黄色| 日韩一级在线| 色情视频在线观看| 人人澡人人添人人爽人人| 综合大香蕉| 中文字幕av免费在线观看| 午夜狠狠操| 五月亚洲六月婷婷| 丁香婷婷五月| 蜜桃av秘无码一区二区三区| 亚洲永久视频| 热久久这里只有精品| 逼特逼在线视频| 国产日韩一区二区三免费高清| 黄色一级在线| 欧美综合高清| 国产色情性黄片Av网站| 天干天干天夜夜爽| 丝袜人妻| 丁香五月六月婷婷| 大伊香蕉在线| 欧美日韩国产91| 在线播放毛片| 淫色综合网| 国产视频一区二区三区四区| 内射少妇18| 三级三级久久三级久久18| 蜜桃视频在线入口www| 国产一a毛一a免费观看| 成人福利电影| 99热99re6国产线播放| 特级西西| 日韩成人黄色视频| 欧美性爱精品一区| 超碰精品| 国产秘久久一区二区| 先锋影音AV在线| 大香蕉超碰在线| 三级片高清无码| 狠狠狠狠狠狠狠狠| 午夜欧美性爱视频| 久久久精品淫秽色情| 国产激情内射| 午夜老司机福利| 天天搞天天曰在线观看| 亚洲影音| 操逼免费网站| 婷婷久| 色欲一区| 1插菊花综合| 东北老女人操逼视频| 成人午夜在线观看| 中文久久久| 嫩BBB槡BBBB槡BBBB免费视频 | 免费中文字幕av| 亚洲乱伦网站| 真实白嫖91探花无码| 亚洲爱爱网站| 成人久久久久久| 91美女操逼视频| 91天天综合在线| www、久久| 日本三级片网站在线观看| 柠檬福利第一导航| 国产无码一区二区| 怡春院免费视频| 超碰免费在线观看| 激情视频网| 日本无码电影| 精品国产乱码久久久久久郑州公司 | 91av久久| 国产精品免费观看久久久久久久久| 中文字幕精品视频在线观看| 日韩一级片网站| 四季AV之日韩人妻无码| 成人激情四射网| 中国操逼毛片| 无码精品黑人| 人妻中文字幕av| 黑人在线播放| 在线观看亚洲无码视频| 天天草夜夜操| 久久久久久无码精品亚洲日韩麻豆 | 黑人操白人| 麻豆mdapp03.tⅴ| 日本韩国无码| 国产精品av在线| 北京熟妇槡BBBB槡BBBB| 无码狠狠躁久久久久久久91| 亚洲欧美日韩一区| 日本在线精品视频| 岛国免费AV| 欧美精品成人免码在线| 一级a一级a爱片免费免免高潮| 亚洲性爱一级片| 自慰一区二区| 亚洲少妇性爱视频| 日韩无码三级视频| 老太色HD色老太HD.| 先锋影音亚洲无码av| 亚洲wwwwww| 老太奶性BBwBBw侧所| 人人妻人人澡人人爽久久| 翔田千里无码精品| 肉片无遮挡一区二区三区免费观看视频 | 日韩成人片无码| 可以看的三级网站| 佐山爱人妻无码蜜桃| 日韩一区二区三免费高清在线观看| 欧美综合亚洲图片综合区| 麻豆天美传媒AV果冻传媒| 最近中文字幕高清2019中文字幕| 日韩一级黄片| 欧美经典自拍狼友| 欧美毛视频| 看一级黄色毛片| 精品一区二区三区蜜桃臀www| 懂色av懂色av粉嫩av分享吧| 天天干强奸视频在线综合| 日韩无码人妻一区二区三区| 大香蕉伊人在线网| 亚洲欧美成人在线观看| 日韩欧美操| 美女福利在线| 亚洲精品久久久蜜桃| 探花视频在线观看| 久久久人妻| 1024国产| 色九| 日韩免费视频一区二区| 色色视频网站| 色综合久久88色综合天天99| 亚洲AV第二区国产精品| 免费人妻视频| 亚洲性爱AV| 麻豆视频一区| 啪啪视频最新地址发布页| 日本A级毛片| A片小视频| 综合天堂AV久久久久久久| 草逼com| 一级黄色毛片| 天天躁狠狠躁av| 日无码在线| 欧美老妇BBBBBBBBB| 欧美日韩视频| 男女啪啪网站| 精品无码一区二区人妻久久蜜桃| 国产丝袜AV| 欧美黄色a片| 国产黄色片免费| 五月丁香婷婷在线观看| 亚洲免费观看高清完| 久久九九电影| 大香蕉在8线| 91av久久| 亚洲1区2区| 色五婷婷| 黄色录像一级片| 日韩黄色大片| 中文字幕免费在线观看| 国产在线| 日韩在线观看视频免费| 伊人大香蕉在线网| 国产精品久免费的黄网站| 丁香六月婷婷综合缴| 成人免费三级| 爱爱视频天天干| caopor在线| 欧美成人性爱视频| 东京热视频免费观看| 欧美三级美国一级| 俺来也俺去了| 俺来也AV| 国产乱子伦日B视频| 肉片无遮挡一区二区三区免费观看视频 | 伊人色色| 日韩性爱在线视频| 国产成人精品免费看视频| 中文字幕丰满熟妇人妻| 欧美精品18| 嫩BBB搡BBB槡BBB小号| 日本一区二区三区在线播放| 综合色婷婷一区二区亚洲欧美国产| 一级大片| 闷骚艳岳的婬乱生活视频| 亚洲欧洲有码在线| 正在播放无码| 人人天天久久| 大香蕉这里只有精品| 97人人射| 日本免费黄色片| 国产精品一二三| 蜜桃视频91| 国产精品777777| 成人小说视频| 日韩性爱小视频| av三级片在线观看| 丰满人妻一区二区三区| 91在线无码精品秘网站| 密臀91| 欧美福利在线观看| 大茄子熟女AV导航| 91婷婷五月天| 亚洲AAA| 中文字幕永久在线视频v1.0| 99热999| 亚洲成人性爱视频| 欧美在线小视频| 日韩无码一级| 久久亚洲日韩天天做日日做综合亚洲| 亚洲av黄| 久久99精品国产.久久久久久| 一区二区在线看| 国产一级免费| 欧美日韩久久| 无码精品人妻一区二区| 欧美国产在线观看| 91久久免费视频| 在线免费观看毛片| 波多野结衣高清无码| 国产黄色视频观看| 国产日韩欧美91| 自拍偷拍15p| 天天操天天干天天射| 激情六月| 婷婷五月激情中文字幕| 欧美日韩国产免费观看成人片| 亚洲www在线观看| 青草精品视频| 殴美亚洲一流| 国产欧美精品一区二区三区 | A片视频免费| 欧美狠狠| 18禁片网站| xxx一区二区| 狠狠躁日日躁夜夜躁2022麻豆 | 初学影院WWWBD英语完整版在线观看 | 免费做a爰片77777| 欧美成人大香蕉| 超碰AA| 成人黄网站在线观看| 成人视频18+在线观看| 天天综合天天做天天综合| 久久精品在线视频| 天天摸天天摸| 亚洲精品秘一区二区三区影| 成人毛片100免费观看| 国产秘久久一区二区| 阿拉伯三级片| 无码国产+白浆| 撸久久| 亚洲A√| 夜夜爽夜夜高潮夜夜爽| 水蜜桃成人网| 色综合天天综合网国产成人网| 成人三级片网站| 国产精品视频一区二区三区在线观看 | 波多无码在线| 国产又粗又长的视频| S28AV| 欧美日韩无| 日韩黄网| 亚洲一级黄色| yy午夜福利| 91三级片网站| 操欧美美女| 日韩毛片视频| 一区二区三区小视频| 日本理论片一道本| 成人特级毛片| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 青娱乐91视频| 成人国产精品| 成人国产片女人爽到高潮| 男人操女人免费网站| 色婷婷日韩精品一区二区三区| 亚洲欧美性爱| 很很撸在线视频| 国产精品婷婷久久久| 91av成人| 自拍无码视频| 96久久| 四虎高清无码| 午夜福利干B在线免费小视频| 亚洲无码人妻在线| 无码人妻精品一区| 97资源在线| 五月天丁香婷婷视频| 在线观看国产小视频| 丁香av| 天天操人人妻| 天天拍天天射| 五月在线| 被男友内S~高H文| 亚洲成人午夜电影| 国产一区二区三区视频在线观看| 国产日逼视频| 成人手机在线视频| 久久久夜夜夜| 国产拍拍拍| 日韩欧美中文字幕视频| 豆花在线视频| 久久久精品电影| 欧美日韩国产三级| 亚洲人成小说| 青青久草| 蜜桃无码视频小说网站| 五月天婷婷久久| 免费观看无码视频| 国产精品2025| 一本色综合亚洲精品| 亚洲视频一区二区三区| 人人澡av| 超碰免费观看| 91视频观看| 国产乱子伦一区二区三区视频 | 免费看一级无码成人片| 中文字幕免费中文| 日韩在线视频中文字幕码无| 欧一美一婬一伦一区| 大BBBw大BBBW另类| 人人草人人摸人人看| 亚洲小说区图片区| 国产内射久久| 国产91在线观看| 大香蕉现在视频中心一| 夜夜骑夜夜撸| 91福利导航| 麻豆精品传媒国产剧的特点| 无码入口| 黄色成人网站在线免费观看| 在线日韩一区二区| 日本无码在线视频| 亚洲成人无码在线观看| 台湾中文字幕网| 在线少妇| 日韩黄色电影在线免费观看| 日韩精品一区在线| 老熟女痒到不行-ThePorn| 狠狠色噜噜狠狠狠7777米奇网| 免费无码av| 国产你懂的| 国产污视频在线观看| 丁香婷婷色| 欧美亚洲成人网站| 亚洲av自拍| 国内精品一区二区| 逼逼AV| 国产精品国产精品国产专区不卡|