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

漫談C#開發中的垃圾回收機制

開發 后端
今天我們漫談C#中的垃圾回收機制,本文將從垃圾回收機制的原理講起,希望對大家有所幫助。

GC的前世與今生

雖然本文是以.NET作為目標來講述GC,但是GC的概念并非才誕生不久。早在1958年,由鼎鼎大名的圖林獎得主John McCarthy所實現的Lisp語言就已經提供了GC的功能,這是GC的***次出現。Lisp的程序員認為內存管理太重要了,所以不能由程序員自己來管理。但后來的日子里Lisp卻沒有成氣候,采用內存手動管理的語言占據了上風,以C為代表。出于同樣的理由,不同的人卻又不同的看法,C程序員認為內存管理太重要了,所以不能由系統來管理,并且譏笑Lisp程序慢如烏龜的運行速度。的確,在那個對每一個Byte都要精心計算的年代GC的速度和對系統資源的大量占用使很多人的無法接受。而后,1984年由Dave Ungar開發的Small talk語言***次采用了Generational garbage collection的技術(這個技術在下文中會談到),但是Small talk也沒有得到十分廣泛的應用。

直到20世紀90年代中期GC才以主角的身份登上了歷史的舞臺,這不得不歸功于Java的進步,今日的GC已非吳下阿蒙。Java采用VM(Virtual Machine)機制,由VM來管理程序的運行當然也包括對GC管理。90年代末期.NET出現了,.NET采用了和Java類似的方法由CLR(Common Language Runtime)來管理。這兩大陣營的出現將人們引入了以虛擬平臺為基礎的開發時代,GC也在這個時候越來越得到大眾的關注。

為什么要使用GC呢?也可以說是為什么要使用內存自動管理?有下面的幾個原因:

1、提高了軟件開發的抽象度;

2、程序員可以將精力集中在實際的問題上而不用分心來管理內存的問題;

3、可以使模塊的接口更加的清晰,減小模塊間的偶合;

4、大大減少了內存人為管理不當所帶來的Bug;

5、使內存管理更加高效。

總的說來就是GC可以使程序員可以從復雜的內存問題中擺脫出來,從而提高了軟件開發的速度、質量和安全性。

什么是GC

GC如其名,就是垃圾收集,當然這里僅就內存而言。Garbage Collector(垃圾收集器,在不至于混淆的情況下也成為GC)以應用程序的root為基礎,遍歷應用程序在Heap上動態分配的所有對象[2],通過識別它們是否被引用來確定哪些對象是已經死亡的哪些仍需要被使用。已經不再被應用程序的root或者別的對象所引用的對象就是已經死亡的對象,即所謂的垃圾,需要被回收。這就是GC工作的原理。為了實現這個原理,GC有多種算法。比較常見的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虛擬系統.net CLR,Java VM和Rotor都是采用的Mark Sweep算法。

一、Mark-Compact 標記壓縮算法 簡單把.NET的GC算法看作Mark-Compact算法

階段1: Mark-Sweep 標記清除階段

先假設heap中所有對象都可以回收,然后找出不能回收的對象,給這些對象打上標記,***heap中沒有打標記的對象都是可以被回收的

階段2: Compact 壓縮階段

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

alt

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

主要處理步驟:將線程掛起=>確定roots=>創建reachable objectsgraph=>對象回收=>heap壓縮=>指針修復

可以這樣理解roots:heap中對象的引用關系錯綜復雜(交叉引用、循環引用),形成復雜的graph,roots是CLR在heap之外可以找到的各種入口點。GC搜索roots的地方包括全局對象、靜態變量、局部對象、函數調用參數、當前CPU寄存器中的對象指針(還有finalizationqueue)等。主要可以歸為2種類型:已經初始化了的靜態變量、線程仍在使用的對象(stack+CPU register)

Reachable objects:指根據對象引用關系,從roots出發可以到達的對象。例如當前執行函數的局部變量對象A是一個rootobject,他的成員變量引用了對象B,則B是一個reachable object。從roots出發可以創建reachable objectsgraph,剩余對象即為unreachable,可以被回收

alt

指針修復是因為compact過程移動了heap對象,對象地址發生變化,需要修復所有引用指針,包括stack、CPUregister中的指針以及heap中其他對象的引用指針

Debug和release執行模式之間稍有區別,release模式下后續代碼沒有引用的對象是unreachable的,而debug模式下需要等到當前函數執行完畢,這些對象才會成為unreachable,目的是為了調試時跟蹤局部對象的內容

傳給了COM+的托管對象也會成為root,并且具有一個引用計數器以兼容COM+的內存管理機制,引用計數器為0時這些對象才可能成為被回收對象

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

二、 Generational 分代算法 程序可能使用幾百M、幾G的內存,對這樣的內存區域進行GC操作成本很高,分代算法具備一定統計學基礎,對GC的性能改善效果比較明顯

將對象按照生命周期分成新的、老的,根據統計分布規律所反映的結果,可以對新、老區域采用不同的回收策略和算法,加強對新區域的回收處理力度,爭取在較短時間間隔、較小的內存區域內,以較低成本將執行路徑上大量新近拋棄不再使用的局部對象及時回收掉

分代算法的假設前提條件:

1、大量新創建的對象生命周期都比較短,而較老的對象生命周期會更長

2、對部分內存進行回收比基于全部內存的回收操作要快

3、新創建的對象之間關聯程度通常較強。heap分配的對象是連續的,關聯度較強有利于提高CPU cache的命中率

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

alt

Heap分為3個代齡區域,相應的GC有3種方式: # Gen 0 collections, # Gen 1 collections, #Gen 2 collections。如果Gen 0 heap內存達到閥值,則觸發0代GC,0代GC后Gen 0中幸存的對象進入Gen1。如果Gen 1的內存達到閥值,則進行1代GC,1代GC將Gen 0 heap和Gen 1 heap一起進行回收,幸存的對象進入Gen2。2代GC將Gen 0 heap、Gen 1 heap和Gen 2 heap一起回收

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

三、Finalization Queue和Freachable Queue

這兩個隊列和.net對象所提供的Finalize方法有關。這兩個隊列并不用于存儲真正的對象,而是存儲一組指向對象的指針。當程序中使用了new操作符在Managed Heap上分配空間時,GC會對其進行分析,如果該對象含有Finalize方法則在Finalization Queue中添加一個指向該對象的指針。在GC被啟動以后,經過Mark階段分辨出哪些是垃圾。再在垃圾中搜索,如果發現垃圾中有被Finalization Queue中的指針所指向的對象,則將這個對象從垃圾中分離出來,并將指向它的指針移動到Freachable Queue中。這個過程被稱為是對象的復生(Resurrection),本來死去的對象就這樣被救活了。為什么要救活它呢?因為這個對象的Finalize方法還沒有被執行,所以不能讓它死去。Freachable Queue平時不做什么事,但是一旦里面被添加了指針之后,它就會去觸發所指對象的Finalize方法執行,之后將這個指針從隊列中剔除,這是對象就可以安靜的死去了。.net framework的System.GC類提供了控制Finalize的兩個方法,ReRegisterForFinalize和SuppressFinalize。前者是請求系統完成對象的Finalize方法,后者是請求系統不要完成對象的Finalize方法。

ReRegisterForFinalize方法其實就是將指向對象的指針重新添加到Finalization Queue中。這就出現了一個很有趣的現象,因為在Finalization Queue中的對象可以復生,如果在對象的Finalize方法中調用ReRegisterForFinalize方法,這樣就形成了一個在堆上永遠不會死去的對象,像鳳凰涅槃一樣每次死的時候都可以復生。

托管資源:

Net中的所有類型都是(直接或間接)從System.Object類型派生的。

CTS中的類型被分成兩大類——引用類型(reference type,又叫托管類型[managed type]),分配在內存堆上,值類型(value type)。值類型分配在堆棧上。如圖

alt

值類型在棧里,先進后出,值類型變量的生命有先后順序,這個確保了值類型變量在推出作用域以前會釋放資源。比引用類型更簡單和高效。堆棧是從高地址往低地址分配內存。

引用類型分配在托管堆(Managed Heap)上,聲明一個變量在棧上保存,當使用new創建對象時,會把對象的地址存儲在這個變量里。托管堆相反,從低地址往高地址分配內存,如圖

alt

.net中超過80%的資源都是托管資源。

非托管資源:

ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,

Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,

Pen,Regex,Socket,StreamWriter,Timer,Tooltip ,文件句柄,GDI資源,數據庫連接等等資源。可能在使用的時候很多都沒有注意到!

.NET的GC機制有這樣兩個問題:

首先,GC并不是能釋放所有的資源。它不能自動釋放非托管資源。

第二,GC并不是實時性的,這將會造成系統性能上的瓶頸和不確定性。

GC并不是實時性的,這會造成系統性能上的瓶頸和不確定性。所以有了IDisposable接口,IDisposable接口定義了Dispose方法,這個方法用來供程序員顯式調用以釋放非托管資源。使用using 語句可以簡化資源管理。

示例

  1.  /// <summary>    
  2.  /// 執行SQL語句,返回影響的記錄數    
  3.  /// </summary>    
  4.  /// <param name="SQLString">SQL語句</param>    
  5.  /// <returns>影響的記錄數</returns>    
  6.  public static int ExecuteSql(string SQLString)    
  7.  {    
  8.  using (SqlConnection connection = new SqlConnection(connectionString))    
  9. {    
  10.  using (SqlCommand cmd = new SqlCommand(SQLString, connection))    
  11.  {    
  12.  try   
  13.  {    
  14. connection.Open();    
  15. int rows = cmd.ExecuteNonQuery();    
  16.  return rows;    
  17.  }    
  18.  catch (System.Data.SqlClient.SqlException e)    
  19.  {    
  20.  connection.Close();    
  21.  throw e;    
  22.  }    
  23. finally   
  24.  {    
  25.  cmd.Dispose();    
  26.  connection.Close();    
  27.  }    
  28.  }    
  29.  }    
  30. }  

當你用Dispose方法釋放未托管對象的時候,應該調用GC.SuppressFinalize。如果對象正在終結隊列(finalization queue),GC.SuppressFinalize會阻止GC調用Finalize方法。因為Finalize方法的調用會犧牲部分性能。如果你的Dispose方法已經對委托管資源作了清理,就沒必要讓GC再調用對象的Finalize方法(MSDN)。附上MSDN的代碼,大家可以參考.

  1.  public class BaseResource : IDisposable    
  2.  {    
  3. // 指向外部非托管資源    
  4.  private IntPtr handle;    
  5. // 此類使用的其它托管資源.    
  6.  private Component Components;    
  7. // 跟蹤是否調用.Dispose方法,標識位,控制垃圾收集器的行為    
  8.  private bool disposed = false;    
  9.  // 構造函數    
  10. public BaseResource()    
  11. {    
  12. // Insert appropriate constructor code here.    
  13. }    
  14. // 實現接口IDisposable.    
  15. // 不能聲明為虛方法virtual.    
  16. // 子類不能重寫這個方法.    
  17.  public void Dispose()    
  18.  {    
  19.  Dispose(true);    
  20.  // 離開終結隊列Finalization queue    
  21.  // 設置對象的阻止終結器代碼    
  22.  //    
  23. GC.SuppressFinalize(this);    
  24. }    
  25.  // Dispose(bool disposing) 執行分兩種不同的情況.    
  26.  // 如果disposing 等于 true, 方法已經被調用    
  27.  // 或者間接被用戶代碼調用. 托管和非托管的代碼都能被釋放    
  28.  // 如果disposing 等于false, 方法已經被終結器 finalizer 從內部調用過,    
  29.  //你就不能在引用其他對象,只有非托管資源可以被釋放。    
  30. protected virtual void Dispose(bool disposing)    
  31.  {    
  32.  // 檢查Dispose 是否被調用過.    
  33.  if (!this.disposed)    
  34.  {    
  35.  // 如果等于true, 釋放所有托管和非托管資源    
  36.  if (disposing)    
  37.  {    
  38.  // 釋放托管資源.    
  39. Components.Dispose();    
  40.  }    
  41. // 釋放非托管資源,如果disposing為 false,    
  42.  // 只會執行下面的代碼.    
  43. CloseHandle(handle);    
  44. handle = IntPtr.Zero;    
  45.  // 注意這里是非線程安全的.    
  46. // 在托管資源釋放以后可以啟動其它線程銷毀對象,    
  47.  // 但是在disposed標記設置為true前    
  48. // 如果線程安全是必須的,客戶端必須實現。    
  49.  }    
  50. disposed = true;    
  51. }    
  52.  // 使用interop 調用方法    
  53. // 清除非托管資源.    
  54.  [System.Runtime.InteropServices.DllImport("Kernel32")]    
  55. private extern static Boolean CloseHandle(IntPtr handle);    
  56. // 使用C# 析構函數來實現終結器代碼    
  57. // 這個只在Dispose方法沒被調用的前提下,才能調用執行。    
  58.  // 如果你給基類終結的機會.    
  59.  // 不要給子類提供析構函數.    
  60.  ~BaseResource()    
  61.  {    
  62.  // 不要重復創建清理的代碼.    
  63. // 基于可靠性和可維護性考慮,調用Dispose(false) 是***的方式    
  64.  Dispose(false);    
  65.  }    
  66.  // 允許你多次調用Dispose方法,    
  67.  // 但是會拋出異常如果對象已經釋放。    
  68.  // 不論你什么時間處理對象都會核查對象的是否釋放,    
  69.  // check to see if it has been disposed.    
  70.  public void DoSomething()    
  71.  {    
  72. if (this.disposed)    
  73.  {    
  74. throw new ObjectDisposedException();    
  75.  }    
  76.  }    
  77. // 不要設置方法為virtual.    
  78.  // 繼承類不允許重寫這個方法    
  79.  public void Close()    
  80. {    
  81. // 無參數調用Dispose參數.    
  82. Dispose();    
  83.  }    
  84.  public static void Main()    
  85.  {    
  86. // Insert code here to create    
  87.  // and use a BaseResource object.    
  88.  }    
  89.  }  
 
GC.Collect() 方法

作用:強制進行垃圾回收。

GC的方法:

名稱

說明

Collect()

強制對所有代進行即時垃圾回收。

Collect(Int32)

強制對零代到指定代進行即時垃圾回收。

Collect(Int32, GCCollectionMode)

強制在 GCCollectionMode 值所指定的時間對零代到指定代進行垃圾回收。

GC注意事項:

1、只管理內存,非托管資源,如文件句柄,GDI資源,數據庫連接等還需要用戶去管理

2、循環引用,網狀結構等的實現會變得簡單。GC的標志也壓縮算法能有效的檢測這些關系,并將不再被引用的網狀結構整體刪除。

3、GC通過從程序的根對象開始遍歷來檢測一個對象是否可被其他對象訪問,而不是用類似于COM中的引用計數方法。

4、GC在一個獨立的線程中運行來刪除不再被引用的內存

5、GC每次運行時會壓縮托管堆

6、你必須對非托管資源的釋放負責。可以通過在類型中定義Finalizer來保證資源得到釋放。

7、對象的Finalizer被執行的時間是在對象不再被引用后的某個不確定的時間。注意并非和C++中一樣在對象超出聲明周期時立即執行析構函數

8、Finalizer的使用有性能上的代價。需要Finalization的對象不會立即被清除,而需要先執行Finalizer.Finalizer不是在GC執行的線程被調用。GC把每一個需要執行Finalizer的對象放到一個隊列中去,然后啟動另一個線程來執行所有這些Finalizer.而GC線程繼續去刪除其他待回收的對象。在下一個GC周期,這些執行完Finalizer的對象的內存才會被回收。

9、.NET GC使用"代"(generations)的概念來優化性能。代幫助GC更迅速的識別那些最可能成為垃圾的對象。在上次執行完垃圾回收后新創建的對象為第0代對象。經歷了一次GC周期的對象為第1代對象。經歷了兩次或更多的GC周期的對象為第2代對象。代的作用是為了區分局部變量和需要在應用程序生存周期中一直存活的對象。大部分第0代對象是局部變量。成員變量和全局變量很快變成第1代對象并最終成為第2代對象。

10、GC對不同代的對象執行不同的檢查策略以優化性能。每個GC周期都會檢查第0代對象。大約1/10的GC周期檢查第0代和第1代對象。大約1/100的GC周期檢查所有的對象。重新思考Finalization的代價:需要Finalization的對象可能比不需要Finalization在內存中停留額外9個GC周期。如果此時它還沒有被Finalize,就變成第2代對象,從而在內存中停留更長時間。

原文鏈接:http://www.cnblogs.com/springyangwc/archive/2011/06/13/2080149.html

【編輯推薦】

  1. 漫談C#開發中的反射機制
  2. 漫談C#開發中的ASP.NET頁生命周期
  3. 淺析C#延遲加載的運行機制和應用場景
  4. C#多線程中lock的用法
  5. 用C#實現HTTP協議下的多線程文件傳輸

 

責任編輯:彭凡 來源: 博客園
相關推薦

2017-06-12 17:38:32

Python垃圾回收引用

2017-03-03 09:26:48

PHP垃圾回收機制

2017-08-17 15:40:08

大數據Python垃圾回收機制

2010-09-25 15:33:19

JVM垃圾回收

2011-07-04 16:48:56

JAVA垃圾回收機制GC

2009-06-23 14:15:00

Java垃圾回收

2011-06-08 10:06:32

C#

2021-11-05 15:23:20

JVM回收算法

2024-10-28 13:18:54

2023-03-26 22:48:46

Python引用計數內存

2010-09-16 15:10:24

JVM垃圾回收機制

2021-05-27 21:47:12

Python垃圾回收

2010-09-25 15:26:12

JVM垃圾回收

2010-10-13 10:24:38

垃圾回收機制JVMJava

2021-12-07 08:01:33

Javascript 垃圾回收機制前端

2015-06-04 09:38:39

Java垃圾回收機

2011-06-28 12:39:34

Java垃圾回收

2016-12-01 11:20:42

2022-07-21 09:15:28

C++垃圾回收

2017-10-12 12:41:11

PHP圾回收機制變量容器
點贊
收藏

51CTO技術棧公眾號

777欧美精品| 四虎精品在线| 青草av在线| 亚洲精品人人| 中文字幕一区在线| 欧美激情视频一区二区三区不卡 | 亚洲人成精品久久久 | 国产成人免费高清| 国产一区二区美女视频| 免费观看亚洲视频| 91视频在线网站| 羞羞电影在线观看www| 免费在线观看精品| 日韩av中文字幕在线免费观看| 99亚洲国产精品| 6—12呦国产精品| 国精一区二区| 欧美性猛交xxxxx免费看| 91精品国自产在线观看 | 国产精品视频麻豆| 欧美中文字幕在线观看| 玖玖爱在线精品视频| 婷婷在线播放| 国产欧美一二三区| 日韩女优在线播放| 国产艳俗歌舞表演hd| 免费一二一二在线视频| 丁香婷婷综合色啪| 欧美激情综合亚洲一二区| 99久久综合网| 黄色免费网站在线观看| 久久精品国产一区二区| 久久精品国产亚洲精品| 可以看污的网站| 欧美精品videos另类| 激情综合一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 嫩草av久久伊人妇女超级a| 日本私人网站在线观看| 青娱乐精品视频| 色偷偷噜噜噜亚洲男人| 中文字幕在线免费看线人| 69精品国产久热在线观看| 一二三四社区欧美黄| 国产精品伊人日日| 国产成年人免费视频| 伊人精品综合| 欧美乱妇15p| 男人天堂网站在线| 日本高清视频在线观看| 国产精品996| 成人欧美一区二区三区黑人| 美女视频黄免费| 老司机精品在线| 精品成人乱色一区二区| 日本一区二区久久精品| 欧美国产一级片| 色135综合网| 欧美精品在线观看播放| 在线观看av网页| 日韩专区av| 亚洲激情在线播放| 欧美二区三区| 国产精品久久久久毛片| 在线播放亚洲| 视频在线观看99| 青青青视频在线播放| 亚洲精品三区| 精品久久久久久久久久| 国产免费黄色小视频| 国产日本在线视频| 国产精品亚洲第一| 国产精品久久久久久网站| 劲爆欧美第一页| 国内一区二区三区| 亚洲色图35p| 成人欧美精品一区二区| 久久xxx视频| 一区二区三区蜜桃网| www.在线观看av| 日本三级视频在线观看| 亚洲精品写真福利| 欧美综合激情| 一级日本在线| 亚洲精品国产一区二区精华液 | 久久av免费观看| 亚洲一区二区影视| 中文亚洲免费| 久久国产精品久久久久久久久久| 极品人妻一区二区三区| 欧美国产中文高清| 欧美午夜影院一区| 国产极品尤物在线| 成人全视频高清免费观看| 粉嫩一区二区三区性色av| 国产精品免费小视频| 国产又黄又猛又爽| 99久久久精品| 国产精品v欧美精品v日韩| 91中文字幕在线播放| 国产91精品露脸国语对白| 久久久久九九九| 麻豆网站在线免费观看| 精品国产乱码久久久久久天美 | 中文字幕一区二区三区四区欧美| 精品亚洲aⅴ乱码一区二区三区| 国产伦精品一区二区三区免| 91美女视频在线| 2017欧美狠狠色| 国产精品裸体一区二区三区| 高清av电影在线观看| 亚洲综合视频在线观看| 亚洲欧美日韩一级| 欧美亚洲国产日韩| 日韩电影免费在线观看中文字幕| 成人欧美一区二区三区黑人一| av一区二区在线观看| 亚洲欧洲日产国产网站| 欧美日韩在线观看免费| 亚洲乱码精品| 伦理中文字幕亚洲| 久久久久亚洲av片无码| 色老板在线视频一区二区| 亚洲国产精品小视频| 亚洲av成人精品一区二区三区| 99国产精品久久一区二区三区| 日韩精品最新网址| wwwxxx色| 99精品国产一区二区三区| 色偷偷亚洲男人天堂| 亚洲午夜18毛片在线看| 免费在线日韩av| 久久久久久中文字幕| 艳妇乳肉豪妇荡乳av| 久久久久99精品国产片| 日韩精品一区二区三区四区五区 | 在线播放日韩专区| 91ts人妖另类精品系列| 久久一区国产| 国产一区二中文字幕在线看 | 91精品国产入口| 日本wwwxx| 久久久国产精品| 欧美激情在线狂野欧美精品| 国产普通话bbwbbwbbw| 成人性色生活片| 麻豆传媒网站在线观看| crdy在线观看欧美| 久久久99久久精品女同性| 夜夜爽8888| 亚洲男人天堂一区| 在线成人免费av| 成人线上播放| 欧美国产视频一区二区| 国内精品久久久久久久久久| 成人网男人的天堂| 免费特级黄色片| 亚洲成人激情社区| 在线不卡a资源高清| 日韩av毛片在线观看| 精东粉嫩av免费一区二区三区| 亚洲一区二区精品在线观看| 日本资源在线| 精品国产乱码久久久久久闺蜜| 精品国产无码在线观看| 久久精品主播| 亚洲视频sss| 精品视频在线观看免费观看| 免费91麻豆精品国产自产在线观看| 国产美女无遮挡永久免费| 亚洲卡通动漫在线| 伊人网综合视频| 久久精品123| 午夜精品亚洲一区二区三区嫩草| 图片区小说区亚洲| 亚洲国产成人在线视频| 欧美手机在线观看| 国产精一区二区三区| 欧美男女爱爱视频| 成人乱码手机视频| 亚洲精选中文字幕| 欧美国产精品一二三| 99久久久国产精品| 看欧美ab黄色大片视频免费 | 7777精品伊人久久久大香线蕉完整版 | 免费国偷自产拍精品视频| 黄色免费成人| 日韩欧美在线一区二区| 欧美经典影片视频网站| 欧美性在线观看| 亚洲av无码乱码国产精品久久| 欧美激情在线看| 无套内谢丰满少妇中文字幕| 亚洲精品孕妇| 宅男一区二区三区| 日韩欧美一区二区三区免费观看| 久久久国产精品x99av | 国产在线精品91| 手机在线电影一区| 欧美一级成年大片在线观看 | 色婷婷av一区二区三区丝袜美腿| 国产精自产拍久久久久久蜜| 极品美乳网红视频免费在线观看| 五月天久久比比资源色| 日本裸体美女视频| 91麻豆文化传媒在线观看| 国产妇女馒头高清泬20p多| 欧美亚洲激情| 国产精品美女免费视频| 国产三级伦理在线| 精品国产99国产精品| 五月婷婷六月婷婷| 亚洲不卡av一区二区三区| 中文字幕制服丝袜| 欧美午夜视频| 国产精品久久久久久久久婷婷 | 97超级碰碰| 78精品国产综合久久香蕉| 一个人www欧美| 天天射,天天干| 精品国产福利在线| 538任你躁在线精品视频网站| 国产亚洲美州欧州综合国| 国产日韩成人内射视频| 亚洲韩日在线| 97久久国产亚洲精品超碰热| 国产精品久久久久无码av| 日韩av在线电影观看| 日本成人7777| 国产精品久久久久久久天堂第1集| 奇米一区二区| 久久久久久91| 中文字幕在线观看网站| 精品国产百合女同互慰| av中文在线观看| 欧美猛男超大videosgay| 中文字幕在线天堂| 在线中文字幕一区| 在线看的片片片免费| 国产精品热久久久久夜色精品三区| 免费观看av网站| 久久免费电影网| 欧美熟妇一区二区| 国产亚洲精品bt天堂精选| 少妇真人直播免费视频| 久久久久青草大香线综合精品| 亚洲天堂网一区二区| 久久这里只有精品首页| 魔女鞋交玉足榨精调教| 国产性天天综合网| 日本综合在线观看| 成人不卡免费av| 亚洲黄色小视频在线观看| 老司机午夜精品视频| www.色偷偷.com| 久久婷婷亚洲| 欧美精品色婷婷五月综合| 99久久精品费精品国产风间由美| 亚洲一卡二卡三卡四卡无卡网站在线看| 日韩成人精品一区二区| 超碰在线免费观看97| 午夜欧洲一区| 欧美中日韩免费视频| 日韩av免费大片| 日韩中文在线字幕| 亚洲成人中文| 国产性生交xxxxx免费| 美女视频一区二区| 最好看的中文字幕| 99久久综合99久久综合网站| 中文字幕免费高清| 丁香婷婷综合激情五月色| 污片免费在线观看| 欧美激情中文不卡| 黄色一级视频免费| 欧美丝袜一区二区| 在线视频 91| 精品国产123| 久久米奇亚洲| 亚洲国产精品电影在线观看| 亚洲av成人无码久久精品老人| 正在播放亚洲一区| 日本xxxx人| 日韩欧美美女一区二区三区| 少妇高潮一区二区三区69| 日韩精品黄色网| 免费的黄网站在线观看| 高清一区二区三区四区五区| dj大片免费在线观看| 色婷婷综合久久久久中文字幕1| www免费在线观看| 日韩av片电影专区| 国产麻豆一区二区三区| 久久av免费一区| 围产精品久久久久久久| 18岁网站在线观看| 国产真实乱对白精彩久久| 午夜免费福利视频在线观看| 成人免费视频网站在线观看| 免费看91的网站| 日本一区二区三区四区在线视频 | 岛国视频免费在线观看| 欧美激情2020午夜免费观看| 99热播精品免费| 精品毛片久久久久久| 豆花视频一区二区| 国产精品麻豆免费版| 99精品在线观看| av免费在线播放网站| 久久深夜福利| 99re这里只有| 亚洲人成小说网站色在线| 欧美成人精品一区二区免费看片| 在线欧美一区二区| 五月婷婷深深爱| 欧美乱大交xxxxx另类电影| 婷婷色在线播放| 国产美女精品视频| 国产精品羞羞答答在线观看 | 国产中文在线播放| 91wwwcom在线观看| 三上悠亚激情av一区二区三区 | 国内成人精品一区| 精品三级国产| 中文字幕日韩一区二区三区| 视频一区二区三区入口| 中国av免费看| 五月婷婷激情综合| 高潮一区二区三区乱码| 亚洲国内高清视频| 免费在线看污片| 亚洲最大福利视频网站| 久久久久久久久国产一区| 污视频网站观看| 国产经典欧美精品| 日韩国产第一页| 欧美精品久久99久久在免费线 | 中文字幕日韩一区| www.毛片com| 欧美精品在线观看一区二区| 欧美jizz18性欧美| 成人福利视频在线观看| 99re66热这里只有精品8| 亚洲一级免费在线观看| 国产精品久久久久久久久搜平片| 中文在线观看免费高清| 日韩免费在线观看| 青草av在线| 国产精品一区二区三区观看| 亚洲精选国产| 亚洲色图14p| 在线精品视频小说1| 在线播放日本| 亚洲影院污污.| 麻豆一区二区麻豆免费观看| www.国产在线视频| caoporn国产一区二区| 国产www在线| 这里只有精品丝袜| 欧美少妇网站| 欧洲高清一区二区| 美女精品自拍一二三四| 精品无码一区二区三区蜜臀| 日韩欧中文字幕| 亚洲va久久久噜噜噜无码久久| 欧美激情va永久在线播放| 欧美高清视频看片在线观看| 欧美三级午夜理伦三级| 亚洲国产精品av| 国产一级av毛片| 欧美日韩国产系列| 日韩一区二区三区中文字幕| 国产精品99久久久久久人| 电影一区二区在线观看| 男人天堂999| 懂色av中文一区二区三区| 日韩精品视频免费看| 亚洲午夜久久久影院| 国产成人视屏| 日本日本19xxxⅹhd乱影响| 国产精品视频免费| 全国男人的天堂网| 国产精品久久久久久超碰| 色爱综合av| www.国产视频.com| 欧美日韩色婷婷| 色香蕉在线视频| 国产精品日韩专区| 黄色亚洲免费| 国产三级黄色片| 亚洲成人三级在线| 精品久久在线| 日韩欧美在线电影| 国产91精品露脸国语对白| 日本欧美www| 亚洲男人的天堂在线播放| 成人自拍视频| 91av俱乐部| 亚洲成人av电影| 成人午夜福利视频|