精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解.NET內(nèi)存管理機(jī)制與垃圾回收

開發(fā) 后端
這里將詳細(xì)介紹.NET內(nèi)存管理機(jī)制與垃圾回收,首先將從stack和heap開始談起,同時還會講到一些結(jié)構(gòu)問題,以及GC方式。希望對大家有所幫助。

探討.NET內(nèi)存管理機(jī)制與垃圾回收,也是對.NET平臺編程效率的一種提高。了解.NET內(nèi)存管理機(jī)制對今后對內(nèi)存的操作,具有十分重要的意義。

1. Stack和Heap

每個線程對應(yīng)一個stack,線程創(chuàng)建的時候CLR為其創(chuàng)建這個stack,stack主要作用是記錄函數(shù)的執(zhí)行情況。值類型變量(函數(shù)的參數(shù)、局部變量等非成員變量)都分配在stack中,引用類型的對象分配在heap中,在stack中保存heap對象的引用指針。GC只負(fù)責(zé)heap對象的釋放,heap內(nèi)存空間管理

Heap內(nèi)存分配

Heap內(nèi)存分配

除去pinned object等影響,heap中的內(nèi)存分配很簡單,一個指針記錄heap中分配的起始地址,根據(jù)對象大小連續(xù)的分配內(nèi)存

Stack結(jié)構(gòu)

每個函數(shù)調(diào)用時,邏輯上在thread stack中會產(chǎn)生一個幀(stack frame),函數(shù)返回時對應(yīng)的stack frame被釋放掉
用個簡單的函數(shù)查看執(zhí)行時CLR對棧的處理情況:

  1. static void Main(string[] args)  
  2. {  
  3. int r = Sum(2, 3, 4, 5, 6);  
  4. }  
  5. private static int Sum(int a, int b, int c, int d, int e)  
  6. {  
  7. return a + b + c + d + e;  

JIT編譯后主要匯編代碼如下(其他的情況下匯編代碼可能有所差別,但用這個簡單函數(shù)大致看下棧的管理已經(jīng)足夠):

  1. ;====函數(shù)Main====  
  2. push4 ;第3個參數(shù)到最后一個參數(shù)壓棧  
  3. push5  
  4. push6  
  5. movedx,3 ;第1、第2個參數(shù)分別放入ecx、edx寄存器  
  6. movecx,2   
  7. calldword ptr ds:[00AD96B8h];調(diào)用函數(shù)Sum,執(zhí)行call的時候返回地址(即下面這條mov語句的地址)自動壓棧了  
  8. movdword ptr [ebp-0Ch],eax ;將函數(shù)返回值設(shè)置到局部變量r中(函數(shù)調(diào)用結(jié)束返回值在eax寄存器中)  
  9.  
  10. ;====函數(shù)Sum====  
  11. pushebp ;保存原始ebp寄存器  
  12. movebp,esp ;將當(dāng)前棧指針保存在ebp中,后面使用ebp對參數(shù)和局部變量尋址  
  13. subesp,8 ;分配兩個局部變量  
  14. movdword ptr [ebp-4],ecx ;第1個參數(shù)放入局部變量  
  15. movdword ptr [ebp-8],edx ;第2個參數(shù)放入局部變量  
  16. ...... ;CLR的檢查代碼  
  17. moveax,dword ptr [ebp-4];a + b + c + d + e  
  18. addeax,dword ptr [ebp-8];第1個參數(shù)+第2個參數(shù)(2+3)  
  19. addeax,dword ptr [ebp+10h];+第3個參數(shù)(4)  
  20. addeax,dword ptr [ebp+0Ch];+第4個參數(shù)(5)  
  21. addeax,dword ptr [ebp+8];+第5個參數(shù)(6)  
  22. movesp,ebp;恢復(fù)棧指針(局部變量被釋放了)  
  23. popebp;恢復(fù)原始的ebp寄存器值  
  24. ret0Ch ;函數(shù)返回. 1: 返回地址自動出棧; 2: esp減去0Ch(12個字節(jié)),即從棧中清除調(diào)用參數(shù); 3: 返回值在eax寄存器中執(zhí)行時刻的stack狀態(tài)如下(棧基地址為高端地址,棧頂為低端地址): 

eax寄存器中執(zhí)行時刻的stack狀態(tài)

Stack狀態(tài)變化過程:

a). 調(diào)用者將第3、第4、第5個參數(shù)壓棧,第1、第2個參數(shù)分別放入ecx、edx寄存器

b). call指令調(diào)用函數(shù)Sum,并自動將函數(shù)返回地址壓棧,代碼跳轉(zhuǎn)到函數(shù)Sum開始執(zhí)行

c). 函數(shù)Sum先將寄存器ebp壓棧保存,并將esp放入ebp,用于后面對參數(shù)和局部變量尋址

d). 定義局部變量以及省略掉的是額外代碼,跟Sum函數(shù)業(yè)務(wù)無關(guān)

e). 執(zhí)行加法操作,結(jié)果保存在eax寄存器中

f). 恢復(fù)esp寄存器,這樣函數(shù)Sum中所有的局部變量以及其他壓棧操作全部釋放出來

g). 原始ebp的值出棧,恢復(fù)ebp,這樣棧完全恢復(fù)到進(jìn)入Sum函數(shù)調(diào)用時的狀態(tài)

h). ret指令執(zhí)行函數(shù)返回,返回值在eax寄存器中,返回地址為call指令壓棧的地址,返回地址自動出棧。0Ch指示處理器在函數(shù)返回時釋放棧中12個字節(jié),即由被調(diào)用者清除壓棧的參數(shù)。函數(shù)返回之后,本次Sum調(diào)用的棧分配全部釋放

這種調(diào)用約定類似__fastcall

結(jié)合引用類型變量、值類型的ref參數(shù),下面代碼簡化的stack狀態(tài)如下:

代碼:

  1. public static void Run(int i)  
  2. {  
  3. int j = 9;  
  4. MyClass1 c = new MyClass1();  
  5. c.x = 8;  
  6. int result = Sum(i, 5, ref j, c);  
  7. }  
  8.  
  9. public static int Sum(int a, int b, ref int c, MyClass1 obj)  
  10. {  
  11. int r = a + b + c + obj.x;  
  12. return r;  
  13. }  
  14.  
  15. public class MyClass1  
  16. {  
  17. public int x;  

Stack狀態(tài)

Stack狀態(tài)

任何時候引用類型都分配在heap中,在stack中只是保存對象的引用地址。Run函數(shù)執(zhí)行完畢之后,heap中的MyClass1對象c成為可回收的垃圾對象,在GC時進(jìn)行回收

#p#

2. Mark-Compact 標(biāo)記壓縮算法

簡單把.NET的GC算法看作Mark-Compact算法

階段1: Mark-Sweep 標(biāo)記清除階段

先假設(shè)heap中所有對象都可以回收,然后找出不能回收的對象,給這些對象打上標(biāo)記,最后heap中沒有打標(biāo)記的對象都是可以被回收的

階段2: Compact 壓縮階段

對象回收之后heap內(nèi)存空間變得不連續(xù),在heap中移動這些對象,使他們重新從heap基地址開始連續(xù)排列,類似于磁盤空間的碎片整理。

Compact壓縮階段

Heap內(nèi)存經(jīng)過回收、壓縮之后,可以繼續(xù)采用前面的heap內(nèi)存分配方法,即僅用一個指針記錄heap分配的起始地址就可以

主要處理步驟:將線程掛起=>確定roots=>創(chuàng)建reachable objects graph=>對象回收=>heap壓縮=>指針修復(fù)
可以這樣理解roots:heap中對象的引用關(guān)系錯綜復(fù)雜(交叉引用、循環(huán)引用),形成復(fù)雜的graph,roots是CLR在heap之外可以找到的各種入口點(diǎn)。GC搜索roots的地方包括全局對象、靜態(tài)變量、局部對象、函數(shù)調(diào)用參數(shù)、當(dāng)前CPU寄存器中的對象指針(還有finalization queue)等。主要可以歸為2種類型:已經(jīng)初始化了的靜態(tài)變量、線程仍在使用的對象(stack+CPU register)

Reachable objects:指根據(jù)對象引用關(guān)系,從roots出發(fā)可以到達(dá)的對象。例如當(dāng)前執(zhí)行函數(shù)的局部變量對象A是一個root object,他的成員變量引用了對象B,則B是一個reachable object。從roots出發(fā)可以創(chuàng)建reachable objects graph,剩余對象即為unreachable,可以被回收。

指針修復(fù)

指針修復(fù)是因?yàn)閏ompact過程移動了heap對象,對象地址發(fā)生變化,需要修復(fù)所有引用指針,包括stack、CPU register中的指針以及heap中其他對象的引用指針。

Debug和release執(zhí)行模式之間稍有區(qū)別,release模式下后續(xù)代碼沒有引用的對象是unreachable的,而debug模式下需要等到當(dāng)前函數(shù)執(zhí)行完畢,這些對象才會成為unreachable,目的是為了調(diào)試時跟蹤局部對象的內(nèi)容
傳給了COM+的托管對象也會成為root,并且具有一個引用計(jì)數(shù)器以兼容COM+的內(nèi)存管理機(jī)制,引用計(jì)數(shù)器為0時這些對象才可能成為被回收對象。

Pinned objects指分配之后不能移動位置的對象,例如傳遞給非托管代碼的對象(或者使用了fixed關(guān)鍵字),GC在指針修復(fù)時無法修改非托管代碼中的引用指針,因此將這些對象移動將發(fā)生異常。pinned objects會導(dǎo)致heap出現(xiàn)碎片,但大部分情況來說傳給非托管代碼的對象應(yīng)當(dāng)在GC時能夠被回收掉

3. Generational 分代算法

程序可能使用幾百M(fèi)、幾G的內(nèi)存,對這樣的內(nèi)存區(qū)域進(jìn)行GC操作成本很高,分代算法具備一定統(tǒng)計(jì)學(xué)基礎(chǔ),對GC的性能改善效果比較明顯將對象按照生命周期分成新的、老的,根據(jù)統(tǒng)計(jì)分布規(guī)律所反映的結(jié)果,可以對新、老區(qū)域采用不同的回收策略和算法,加強(qiáng)對新區(qū)域的回收處理力度,爭取在較短時間間隔、較小的內(nèi)存區(qū)域內(nèi),以較低成本將執(zhí)行路徑上大量新近拋棄不再使用的局部對象及時回收掉分代算法的假設(shè)前提條件:

a). 大量新創(chuàng)建的對象生命周期都比較短,而較老的對象生命周期會更長

b). 對部分內(nèi)存進(jìn)行回收比基于全部內(nèi)存的回收操作要快

c). 新創(chuàng)建的對象之間關(guān)聯(lián)程度通常較強(qiáng)。heap分配的對象是連續(xù)的,關(guān)聯(lián)度較強(qiáng)有利于提高CPU cache的命中率

.NET將heap分成3個代齡區(qū)域: Gen 0、Gen 1、Gen 2

Heap分為3個代齡區(qū)域

Heap分為3個代齡區(qū)域,相應(yīng)的GC有3種方式: # Gen 0 collections, # Gen 1 collections, # Gen 2 collections。如果Gen 0 heap內(nèi)存達(dá)到閥值,則觸發(fā)0代GC,0代GC后Gen 0中幸存的對象進(jìn)入Gen 1。如果Gen 1的內(nèi)存達(dá)到閥值,則進(jìn)行1代GC,1代GC將Gen 0 heap和Gen 1 heap一起進(jìn)行回收,幸存的對象進(jìn)入Gen 2。2代GC將Gen 0 heap、Gen 1 heap和Gen 2 heap一起回收

Gen 0和Gen 1比較小,這兩個代齡加起來總是保持在16M左右;Gen 2的大小由應(yīng)用程序確定,可能達(dá)到幾G,因此0代和1代GC的成本非常低,2代GC稱為full GC,通常成本很高。粗略的計(jì)算0代和1代GC應(yīng)當(dāng)能在幾毫秒到幾十毫秒之間完成,Gen 2 heap比較大時full GC可能需要花費(fèi)幾秒時間。大致上來講.NET應(yīng)用運(yùn)行期間2代、1代和0代GC的頻率應(yīng)當(dāng)大致為1:10:100。

ASP.NET程序運(yùn)行的Performance Moniter

圖為一個ASP.NET程序運(yùn)行的Performance Moniter,Gen 0 heap size(紅色)平均6M,Gen 1(藍(lán)色)平均5M,Gen 2(黃色)達(dá)到620M,Gen 0+Gen 1平均13.2M,最大19.8M

直觀上來看,程序的運(yùn)行由一系列函數(shù)調(diào)用組成,函數(shù)運(yùn)行期間會創(chuàng)建很多局部對象,函數(shù)結(jié)束之后也就產(chǎn)生大量待回收的對象。采用分代算法加強(qiáng)較新代齡的垃圾回收力度,通常能夠極大的提高垃圾回收效率,否則就是極特殊的程序,或者是不合理的對象關(guān)聯(lián)設(shè)計(jì)。例如ASP.NET程序,應(yīng)當(dāng)確保絕大部分用于HTTP 請求處理的對象在0代和1代垃圾回收中被釋放掉

為heap記錄幾個指針可以確定代齡區(qū)域范圍,創(chuàng)建reachable objects graph時根據(jù)對象的地址可以確定對象位于哪個代齡區(qū)域,0代GC在創(chuàng)建graph時如果遇到1代、2代heap對象,可以直接越過不用繼續(xù)遍歷下去,較老代齡的對象如果引用了較新代齡的對象,可以通過Win32 API GetWriteWatch訂閱內(nèi)存更新通知,記錄在"card table"中,輔助較低代齡的GC正確構(gòu)造graph

4. LOH

.NET 1.1和2.0中,85000字節(jié)以下的對象稱為小對象,分配在Gen 0 heap中,85000字節(jié)以上的對象稱為大對象,分配在Large Object Heap中,這是因?yàn)镚C在heap壓縮時移動大的內(nèi)存塊需要消耗大量CPU時間,通過性能調(diào)優(yōu)實(shí)踐確定了85000字節(jié)這樣一個閥值。

LOH只在2代GC時進(jìn)行回收,采用Mark-Sweep算法,沒有壓縮處理,因此LOH中的內(nèi)存分配是不連續(xù)的,使用一個空閑列表free list記錄LOH中的空閑空間,對釋放出來的空間進(jìn)行管理。

內(nèi)存空間進(jìn)行管理

上圖中obj1、obj2釋放之后,其空間合并起來成為free list的一個節(jié)點(diǎn),隨后被分配給obj4

什么時候觸發(fā)垃圾回收?

前面已經(jīng)提到,0代和1代垃圾回收主要由閥值控制。初始時Gen 0 heap大小與CPU緩存的大小相關(guān),運(yùn)行時CLR根據(jù)內(nèi)存請求狀態(tài)動態(tài)調(diào)整Gen 0 heap大小,但Gen 0和Gen 1總大小保持在16M左右

Gen 2 heap和LOH都在full GC時進(jìn)行回收,full GC主要由2類事件觸發(fā):

a). 進(jìn)入Gen 2 heap和LOH的對象很多,超過了一定比例。RegisterForFullGCNotification的參數(shù) maxGenerationThreshold、largeObjectHeapThreshold可以分別為Gen 2 heap和LOH設(shè)定這個值

b). 操作系統(tǒng)內(nèi)存吃緊的時候。CLR會接收到操作系統(tǒng)內(nèi)存緊張的通知消息,觸發(fā)full GC

5. Heap細(xì)節(jié)、擴(kuò)容與收縮

Heap的代齡是邏輯上的結(jié)構(gòu),heap實(shí)際內(nèi)存申請和分配以及釋放以segment(段)為單位,workstation GC模式segment大小為16M,server GC模式segment大小為64M。Gen 0和Gen 1 heap總是位于同一個段中,叫做ephemeral segment(新生段),因此max(Gen 0 heap size+Gen 1 heap size)≈16M || 64M,Gen 2 heap由0個或多個segments組成,LOH由1個或多個segments組成。

.NET程序啟動時CLR為heap創(chuàng)建2個segment,一個作為ephemeral segment,另一個用于LOH。.NET使用VirtualAlloc申請和分配heap內(nèi)存,在LOH中分配新對象時沒有足夠的空間,或者1代GC 時進(jìn)入Gen 2的對象過多空間不夠,.NET將為LOH或者小對象heap分配新的segment。申請新的segment失敗將由EE拋出OutOfMemory異常
Full GC后完全空閑的segments將被釋放掉,內(nèi)存返回給操作系統(tǒng)。

.NET 2.0對GC的一個重要改進(jìn)是盡量改善heap碎片處理。heap碎片主要由pinned objects引起,改善措施主要有2個方面。首先是延遲升級,如果ephemeral segment存在pinned objects,則盡可能的延遲他們升級到Gen 2的時間點(diǎn),考慮pinned objects的同時盡量充分利用當(dāng)前ephemeral segment的空間;其次是重復(fù)利用Gen 2的空間,如果Gen 2中存在pinned objects的segments釋放出了足夠空間,該segments可能重新作為ephemeral segment使用

6. GC方式

有Workstation GC with Concurrent GC off、 Workstation GC with Concurrent GC on、Server GC 3種

Workstation GC with Concurrent GC off: 用于單CPU機(jī)器實(shí)現(xiàn)高吞吐量,采用一系列策略觀察內(nèi)存分配以及每次GC的狀況,動態(tài)調(diào)整GC策略,盡可能使程序隨著運(yùn)行時狀態(tài)的變化實(shí)現(xiàn)高效的GC操作,但進(jìn)行GC時會凍結(jié)所有線程
Workstation GC with Concurrent GC on: 用于響應(yīng)時間非常重要的交互式程序,例如流媒體的播放等(如果一次full GC導(dǎo)致應(yīng)用程序中斷幾秒、十幾秒時間,用戶將無法忍受)。

這種方式利用多CPU對full GC進(jìn)行并行處理,不是整個full GC期間凍結(jié)所有線程,而是將full GC切分成多次很短的時間對線程進(jìn)行凍結(jié),在線程凍結(jié)時間之外,應(yīng)用程序仍然可以正常運(yùn)行,進(jìn)行內(nèi)存分配,這主要通過將Gen 0 heap size設(shè)置的比non-concurrent GC大很多而實(shí)現(xiàn),使得GC操作時線程仍然能夠在Gen 0 heap中進(jìn)行內(nèi)存分配,但如果Gen 0 heap用完后GC仍然沒有結(jié)束,線程仍然會出現(xiàn)阻塞。這種方式付出的代價是working set和GC所需時間比non-concurrent GC要大一些。

Server GC: 用于多CPU機(jī)器的服務(wù)器應(yīng)用程序?qū)崿F(xiàn)高吞吐量和伸縮性,充分利用服務(wù)器的大內(nèi)存。.NET為每個CPU創(chuàng)建一組heap(包括Gen 0, 1, 2和LOH)和一個GC線程,每個CPU可以獨(dú)立的為相應(yīng)的heap執(zhí)行GC操作,而其他CPU則正常執(zhí)行處理。最佳的應(yīng)用場景是多線程之間內(nèi)存結(jié)構(gòu)基本相同,執(zhí)行的工作相同或類似

單CPU機(jī)器上只能使用workstation GC,默認(rèn)情況下為Workstation GC with Concurrent GC on方式,單CPU機(jī)器上配置為Server GC無效,仍然使用workstation GC;多CPU服務(wù)器上的ASP.NET默認(rèn)使用Server GC方式,Server GC時不能使用concurrent方式。

concurrent GC可以用于單CPU機(jī)器,它與CPU數(shù)量無關(guān)。

對于ASP.NET程序應(yīng)當(dāng)盡量保證一個CPU僅對應(yīng)一個GC線程,防止同一個CPU上面多個GC線程之間的沖突造成性能問題。如果使用了Web Garden則應(yīng)當(dāng)使用Workstation GC with Concurrent GC off。Web Garden為了提高吞吐量會導(dǎo)致多出幾倍的內(nèi)存使用,每個work process的內(nèi)存有很多重復(fù)部分,Web Garden的最佳應(yīng)用場景是多個進(jìn)程之間使用一個共享的resource pool,避免內(nèi)存的重復(fù)并盡可能的提高吞吐量。在這一點(diǎn)上Server GC應(yīng)當(dāng)與Web Garden類似,但Web Garden在多個進(jìn)程中,而Server GC是在同一個進(jìn)程中通過多線程實(shí)現(xiàn),目前沒有發(fā)現(xiàn)Server GC方面深入一些的資料,很多東西只能根據(jù)現(xiàn)有資料做一些猜想為workstation GC禁用concurrent GC:

  1. <configuration> 
  2. <runtime> 
  3. <gcConcurrent enabled="false"/> 
  4. </runtime> 
  5. </configuration>  

啟用Server GC:

  1. <configuration> 
  2. <runtime> 
  3. <gcServer enabled=“true"/> 
  4. </runtime> 
  5. </configuration>

詳解.NET內(nèi)存管理機(jī)制與垃圾回收就介紹到這里。

本文來自riccc博客園文章《.NET內(nèi)存管理、垃圾回收

【編輯推薦】

  1. .NET Framework詳解之內(nèi)存機(jī)制
  2. .NET內(nèi)存映射文件原理、創(chuàng)建及進(jìn)程通訊
  3. .NET內(nèi)存管理的最佳實(shí)踐
  4. .NET 4.0內(nèi)存映射文件詳解
  5. .NET真的不用管內(nèi)存嗎?從List﹤T﹥列表聊起
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2010-09-26 13:23:13

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

2011-06-29 17:20:20

Qt 內(nèi)存 QOBJECT

2010-12-10 15:40:58

JVM內(nèi)存管理

2020-08-18 19:15:44

Redis內(nèi)存管理

2011-08-15 16:28:06

Cocoa內(nèi)存管理

2017-03-03 09:26:48

PHP垃圾回收機(jī)制

2023-02-28 07:56:07

V8內(nèi)存管理

2010-09-26 16:42:04

JVM內(nèi)存組成JVM垃圾回收

2010-01-06 10:23:47

.NET Framew

2010-07-23 09:34:48

Python

2013-09-29 15:11:46

Linux運(yùn)維內(nèi)存管理

2022-06-01 16:01:58

MySQL內(nèi)存管理系統(tǒng)

2009-07-08 15:10:00

Servlet會話管理

2009-12-09 17:28:34

PHP垃圾回收機(jī)制

2020-11-08 14:32:01

JavaScript變量內(nèi)存管理

2016-10-09 14:41:40

Swift開發(fā)ARC

2022-02-28 10:25:17

Python參數(shù)傳遞拷貝

2021-02-07 09:02:28

內(nèi)存管理length

2011-12-26 09:50:05

.NET垃圾回收

2014-12-19 11:07:40

Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美aⅴ一区二区三区视频| 99只有精品| 97se亚洲国产综合自在线| 午夜精品一区二区三区免费视频 | 亚洲欧美日韩国产| 亚洲欧美另类人妖| 麻豆视频传媒入口| 欧美在线 | 亚洲| 视频一区二区欧美| 精品少妇一区二区30p| 中文字幕一区二区三区人妻不卡| 久久青草视频| 欧美日韩精品在线| 天天做天天爱天天高潮| 天天色天天操天天射| 免费看精品久久片| 97久久伊人激情网| 麻豆天美蜜桃91| 五月激激激综合网色播| 欧美一区二区三区的| 成人在线观看黄| 欧美xxxx少妇| 国产精品久久久久影视| 久久精品99| 国产成人免费看一级大黄| 精品日韩一区| 91高清在线观看| 免费人成在线观看视频播放| 午夜视频在线看| 91麻豆精品一区二区三区| 亚洲自拍偷拍视频| 自拍偷拍第八页| 国产一区白浆| 国产69精品久久久久99| 精品一区二区在线观看视频| 免费黄色成人| 亚洲第一福利网| 亚洲高清av一区二区三区| 欧洲成人一区| 色欧美片视频在线观看| 男人日女人逼逼| 国内在线免费视频| 亚洲老妇xxxxxx| 一本一道久久a久久综合精品| 亚洲视频久久久| 影音先锋一区| 久久久久久亚洲| 在线免费观看亚洲视频| 成人三级视频| 国产亚洲视频在线观看| 一区二区三区伦理片| 任你弄精品视频免费观看| 欧美一级夜夜爽| 国产人妻精品久久久久野外| 日本免费成人| 亚洲小说欧美激情另类| 青青视频免费在线| 影音先锋中文在线视频| 亚洲视频1区2区| www.黄色网址.com| 性国产高清在线观看| 亚洲免费观看在线视频| 精品无码av无码免费专区| bt在线麻豆视频| 亚洲精品视频在线观看网站| av久久久久久| 丁香花在线电影小说观看| 亚洲主播在线观看| 欧美精品卡一卡二| 午夜影院一区| 欧美亚洲综合色| 日韩欧美猛交xxxxx无码| 制服丝袜在线播放| 亚洲成人激情自拍| 春日野结衣av| 成人午夜亚洲| 91精品蜜臀在线一区尤物| 色综合久久久久无码专区| 僵尸再翻生在线观看| 色综合一区二区| 亚洲欧美国产中文| 国产区一区二| 日韩精品极品视频免费观看| 亚洲一区二区三区日韩| 97精品国产福利一区二区三区| 久久精品免费电影| 最近中文字幕免费| 日韩综合精品| 欧美激情精品久久久| 免费看日韩毛片| 青椒成人免费视频| 超碰国产精品久久国产精品99| 无码人妻一区二区三区免费| 毛片基地黄久久久久久天堂| 51国偷自产一区二区三区| 天天干天天操av| 中文字幕乱码久久午夜不卡 | 欧美日本精品| 中文字幕日韩有码| theav精尽人亡av| 成人激情开心网| 欧美激情影音先锋| 国产寡妇亲子伦一区二区三区四区| 奇米四色…亚洲| 国产免费一区二区三区| 中文字幕日本在线| 欧美日韩国产丝袜美女| 九九久久久久久| 神马久久影院| 欧美大片免费看| 最近中文字幕在线免费观看 | 99在线看视频| 国产高清视频免费最新在线| 亚洲国产精品久久久久婷婷884 | 揄拍成人国产精品视频| 中国一级特黄录像播放| 色婷婷色综合| 清纯唯美亚洲激情| 成人久久久精品国产乱码一区二区| 精品一区二区在线免费观看| 国产一区二区高清不卡| 美女免费久久| 在线中文字幕一区| 亚洲啪av永久无码精品放毛片 | 国产免费拔擦拔擦8x在线播放| 欧美日韩一区视频| 99久久久久久久久久| 国产综合婷婷| 亚洲tv在线观看| av网站在线播放| 色猫猫国产区一区二在线视频| 欧美日韩一区二区区别是什么| 成人一级毛片| 国产激情久久久久| 十九岁完整版在线观看好看云免费| 不卡在线观看av| 热久久最新地址| 天天综合91| 中文字幕亚洲一区二区三区五十路| 六月丁香婷婷综合| www.久久久久久久久| 青草网在线观看| 2023国产精华国产精品| 九九热这里只有精品6| 国产免费高清av| 亚洲图片激情小说| 日韩高清在线一区二区| 91视频综合| 91精品美女在线| 国产调教视频在线观看| 午夜亚洲福利老司机| 五月天丁香社区| 激情欧美一区二区三区| 成人做爰66片免费看网站| 欧美伦理免费在线| 亚洲精品在线免费观看视频| 国产一级在线观看视频| 久久人人精品| 欧美一区二区视频在线| 日韩电影大全网站| 一区二区中文字幕| 影音先锋国产在线| 中文字幕综合网| 特级西西444www| 一区二区三区在线| 国产精品一区二区三区观看| 中文在线免费视频| 中文字幕日韩欧美精品在线观看| 一级黄色免费片| 一区二区三区在线影院| 精品人妻在线视频| 久久一二三四| 日韩人妻精品一区二区三区| 97久久综合精品久久久综合| 91精品国产成人www| 国产在线观看免费| 欧美丰满美乳xxx高潮www| 九九视频在线观看| 91色在线porny| mm1313亚洲国产精品无码试看| 日韩欧美伦理| 电影午夜精品一区二区三区| 成人性生交大片免费观看网站| 中国人与牲禽动交精品| 999久久久久| 欧美日韩免费在线观看| 九九热久久免费视频| 成人性视频免费网站| 日韩视频免费在线播放| 一区二区影视| 欧洲亚洲一区二区| 精品一区二区三区中文字幕在线| 97在线视频国产| 欧美成年黄网站色视频| 亚洲第一男人天堂| 在线观看毛片网站| 精品久久香蕉国产线看观看gif| 波多野吉衣在线视频| 久久国产精品毛片| 99久久久无码国产精品性色戒| 欧美黑人做爰爽爽爽| 国产精品欧美一区二区| av老司机免费在线| 色妞色视频一区二区三区四区| 欧美一级淫片免费视频魅影视频| 欧美在线999| 国产精品白浆一区二小说| 中文字幕在线一区免费| 欧美老熟妇乱大交xxxxx| 国产欧美午夜| 欧美少妇在线观看| 一道本一区二区三区| 亚洲影院高清在线| 本网站久久精品| 57pao精品| 国产色婷婷在线| 久久伊人免费视频| av在线第一页| 欧美区一区二区三区| 久久青青草原亚洲av无码麻豆| 一区二区三区波多野结衣在线观看 | 91av亚洲| 国内精品模特av私拍在线观看| 快射视频在线观看| 国产一区二区三区网站| 欧洲免费在线视频| 亚洲国产精品久久91精品| 999免费视频| 欧美日韩一本到| 免费精品一区二区| 黑人巨大精品欧美一区二区三区| 免费在线看黄网址| 亚洲精品乱码久久久久| 91麻豆精品成人一区二区| 国产精品丝袜黑色高跟| 国产中年熟女高潮大集合| 91美女片黄在线观看91美女| 污污内射在线观看一区二区少妇| 国产91综合网| 黑人性生活视频| 亚洲东热激情| 亚洲 欧美 综合 另类 中字| 国产一区亚洲| 免费看毛片的网址| 一区二区亚洲精品| 日韩精品视频在线观看视频| 欧美日韩综合| 日本中文字幕在线视频观看| 亚洲二区免费| 国产亚洲综合视频| 久久久久国产精品一区三寸| 欧美xxxxx在线视频| 日韩国产一区二| 欧美婷婷精品激情| 精品一二三四区| 一级做a爱视频| 成人免费毛片高清视频| 人妻 日韩 欧美 综合 制服| 99re成人在线| 精品欧美一区二区久久久| 国产亚洲欧美日韩俺去了| 国产伦理片在线观看| 中文字幕av在线一区二区三区| 免费看的黄色录像| 亚洲日本在线视频观看| 免费麻豆国产一区二区三区四区| 亚洲va国产天堂va久久en| 日韩欧美一级视频| 91久久精品午夜一区二区| 中文字幕一区二区三区波野结| 欧美嫩在线观看| 农村少妇久久久久久久| 亚洲精品综合精品自拍| 在线免费观看黄色av| 欧美精品一区二区免费| 韩国精品一区| 国产精品美女久久久久av超清| 色狠狠一区二区三区| 国产欧美亚洲日本| 精品国产精品| 国产女主播av| 免费看的黄色欧美网站| 欧美一级xxxx| 成人成人成人在线视频| 国产精品20p| 亚洲精品v日韩精品| 国产成人在线视频观看| 777午夜精品免费视频| 香蕉av在线播放| 欧美mv和日韩mv国产网站| 先锋av资源站| 久久精品亚洲一区| 日韩理论视频| 成人性生交大片免费看小说 | 麻豆成人久久精品二区三区小说| 亚洲成人av免费观看| 久久这里只有精品首页| 男人av资源站| 色婷婷一区二区| www.四虎在线观看| 一区二区三区视频在线| 日韩激情av| 国产日韩欧美视频在线| 欧美激情网址| 伊人网在线免费| 麻豆成人免费电影| 国产成人无码一区二区在线观看| 亚洲天天做日日做天天谢日日欢| 日韩不卡在线播放| 欧美不卡在线视频| av电影在线观看网址| 91av在线播放| 91蜜桃臀久久一区二区| 亚洲自拍三区| 久久精品官网| 日本少妇毛茸茸| 91麻豆.com| 中文字幕av免费在线观看| 欧美性生活一区| 四虎影视在线播放| 久久久久久免费精品| 精品中文字幕一区二区三区| 亚欧洲精品在线视频免费观看| 99精品国产一区二区青青牛奶| 深夜福利网站在线观看| 国产精品国产成人国产三级| 激情视频网站在线观看| 亚洲精品v欧美精品v日韩精品| 欧美理论片在线播放| 91九色对白| 欧美一区不卡| www.午夜av| 综合色中文字幕| 在线观看国产一区二区三区| 一区二区三区视频观看| 日韩制服一区| 日韩精品最新在线观看| 天天久久综合| 亚洲美女性囗交| 国产精品久久国产精麻豆99网站| 成人午夜精品视频| 亚洲深夜福利在线| 免费黄色在线看| 国产精品一区二区电影| 成人黄色av| 亚洲美女性囗交| 亚洲视频在线一区| 99久久久国产精品无码网爆| 久久久久www| 亚洲一区二区三区在线免费| 精品人妻人人做人人爽| 国产91丝袜在线播放0| 久久久久久天堂| 色噜噜狠狠成人中文综合| 天堂а在线中文在线无限看推荐| 欧美亚洲另类激情另类| 免费不卡中文字幕在线| 欧美精品aaaa| 日韩毛片一二三区| www.色播.com| 性色av一区二区三区免费| 色爱av综合网| 成人一区二区三| 国产精品二三区| 亚洲精品国产精| 668精品在线视频| 欧美老女人另类| 日韩 国产 一区| 亚洲狠狠爱一区二区三区| 五月激情婷婷网| 国产精品欧美一区二区| 国产精品久久天天影视| 国产成人av片| 色综合视频在线观看| 毛片在线播放网站| 国内精品久久久久久影视8| 外国成人在线视频| 一区二区免费av| 亚洲成人av资源| 东热在线免费视频| 51精品国产人成在线观看| 99热精品在线观看| 懂色av粉嫩av浪潮av| 欧美sm极限捆绑bd| 桃花岛tv亚洲品质| 丰满人妻一区二区三区53号| 99精品视频在线观看| 在线观看亚洲国产| 97视频免费看| 天天操综合网| 国产精品无码久久久久久| 在线观看91精品国产麻豆| 国产精品电影| 法国空姐在线观看免费| 91视频在线观看免费| 911美女片黄在线观看游戏| 91豆花精品一区| 欧美国产免费| 精品成人无码一区二区三区| 日韩精品一区二区三区四区视频|