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

.NET陷阱之奇怪的OutOfMemoryException

開發(fā) 后端
首先我們來探討另外一個(gè)問題:不考慮非托管內(nèi)存的使用,在最壞情況下,當(dāng)系統(tǒng)出現(xiàn)OutOfMemoryException異常時(shí),有效的內(nèi)存(程序中有GC Root的對(duì)象所占用的內(nèi)存)使用量會(huì)是多大呢?

我們?cè)陂_發(fā)過程中曾經(jīng)遇到過一個(gè)奇怪的問題:當(dāng)軟件加載了很多比較大規(guī)模的數(shù)據(jù)后,會(huì)偶爾出現(xiàn)OutOfMemoryException異常,但通過內(nèi)存檢查工具卻發(fā)現(xiàn)還有很多可用內(nèi)存。于是我們懷疑是可用內(nèi)存總量充足,但卻沒有足夠的連續(xù)內(nèi)存了——也就是說存在很多未分配的內(nèi)存空隙。但不是說.NET運(yùn)行時(shí)的垃圾收集器會(huì)壓縮使用中的內(nèi)存,從而使已經(jīng)釋放的內(nèi)存空隙連成一片嗎?于是我深入研究了一下垃圾回收相關(guān)的內(nèi)容,最終明確的了問題所在——大對(duì)象堆(LOH)的使用。如果你也遇到過類似的問題或者對(duì)相關(guān)的細(xì)節(jié)有興趣的話,就繼續(xù)讀讀吧。

如果沒有特殊說明,后面的敘述都是針對(duì)32位系統(tǒng)。

首先我們來探討另外一個(gè)問題:不考慮非托管內(nèi)存的使用,在最壞情況下,當(dāng)系統(tǒng)出現(xiàn)OutOfMemoryException異常時(shí),有效的內(nèi)存(程序中有GC Root的對(duì)象所占用的內(nèi)存)使用量會(huì)是多大呢?2G? 1G? 500M? 50M?或者更小(是不是以為我在開玩笑)?來看下面這段代碼(參考 https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/)。

  1. public class Program  
  2.  {  
  3.      static void Main(string[] args)  
  4.      {  
  5.          var smallBlockSize = 90000;  
  6.          var largeBlockSize = 1 << 24;  
  7.          var count = 0;  
  8.          var bigBlock = new byte[0];  
  9.          try 
  10.          {  
  11.              var smallBlocks = new List<byte[]>();  
  12.              while (true)  
  13.              {  
  14.                  GC.Collect();  
  15.                  bigBlock = new byte[largeBlockSize];  
  16.                  largeBlockSize++;  
  17.                  smallBlocks.Add(new byte[smallBlockSize]);  
  18.                  count++;  
  19.              }  
  20.          }  
  21.          catch (OutOfMemoryException)  
  22.          {  
  23.              bigBlock = null;  
  24.              GC.Collect();  
  25.              Console.WriteLine("{0} Mb allocated",   
  26.                  (count * smallBlockSize) / (1024 * 1024));  
  27.          }  
  28.            
  29.          Console.ReadLine();  
  30.      }  
  31.  } 

這段代碼不斷的交替分配一個(gè)較小的數(shù)組和一個(gè)較大的數(shù)組,其中較小數(shù)組的大小為90, 000字節(jié),而較大數(shù)組的大小從16M字節(jié)開始,每次增加一個(gè)字節(jié)。如代碼第15行所示,在每一次循環(huán)中bigBlock都會(huì)引用新分配的大數(shù)組,從而使之前的大數(shù)組變成可以被垃圾回收的對(duì)象。在發(fā)生OutOfMemoryException時(shí),實(shí)際上代碼會(huì)有count個(gè)小數(shù)組和一個(gè)大小為 16M + count 的大數(shù)組處于有效狀態(tài)。最后代碼輸出了異常發(fā)生時(shí)小數(shù)組所占用的內(nèi)存總量。

下面是在我的機(jī)器上的運(yùn)行結(jié)果——和你的預(yù)測(cè)有多大差別?提醒一下,如果你要親自測(cè)試這段代碼,而你的機(jī)器是64位的話,一定要把生成目標(biāo)改為x86。

  1. 23 Mb allocated 

考慮到32位程序有2G的可用內(nèi)存,這里實(shí)現(xiàn)的使用率只有1%!

下面即介紹個(gè)中原因。需要說明的是,我只是想以最簡(jiǎn)單的方式闡明問題,所以有些語言可能并不精確,可以參考http://msdn.microsoft.com/en-us/magazine/cc534993.aspx以獲得更詳細(xì)的說明。

.NET的垃圾回收機(jī)制基于“Generation”的概念,并且一共有G0, G1, G2三個(gè)Generation。一般情況下,每個(gè)新創(chuàng)建的對(duì)象都屬于于G0,對(duì)象每經(jīng)歷一次垃圾回收過程而未被回收時(shí),就會(huì)進(jìn)入下一個(gè)Generation(G0 -> G1 -> G2),但如果對(duì)象已經(jīng)處于G2,則它仍然會(huì)處于G2中。

軟件開始運(yùn)行時(shí),運(yùn)行時(shí)會(huì)為每一個(gè)Generation預(yù)留一塊連續(xù)的內(nèi)存(這樣說并不嚴(yán)格,但不影響此問題的描述),同時(shí)會(huì)保持一個(gè)指向此內(nèi)存區(qū)域中尚未使用部分的指針P,當(dāng)需要為對(duì)象分配空間時(shí),直接返回P所在的地址,并將P做相應(yīng)的調(diào)整即可,如下圖所示?!卷槺阏f一句,也正是因?yàn)檫@一技術(shù),在.NET中創(chuàng)建一個(gè)對(duì)象要比在C或C++的堆中創(chuàng)建對(duì)象要快很多——當(dāng)然,是在后者不使用額外的內(nèi)存管理模塊的情況下。】

在對(duì)某個(gè)Generation進(jìn)行垃圾回收時(shí),運(yùn)行時(shí)會(huì)先標(biāo)記所有可以從有效引用到達(dá)的對(duì)象,然后壓縮內(nèi)存空間,將有效對(duì)象集中到一起,而合并已回收的對(duì)象占用的空間,如下圖所示。

但是,問題就出在上面特別標(biāo)出的“一般情況”之外。.NET會(huì)將對(duì)象分成兩種情況區(qū)別對(duì)象,一種是大小小于85, 000字節(jié)的對(duì)象,稱之為小對(duì)象,它就對(duì)應(yīng)于前面描述的一般情況;另外一種是大小在85, 000之上的對(duì)象,稱之為大對(duì)象,就是它造成了前面示例代碼中內(nèi)存使用率的問題。在.NET中,所有大對(duì)象都是分配在另外一個(gè)特別的連續(xù)內(nèi)存(LOH, Large Object Heap)中的,而且,每個(gè)大對(duì)象在創(chuàng)建時(shí)即屬于G2,也就是說只有在進(jìn)行Generation 2的垃圾回收時(shí),才會(huì)處理LOH。而且在對(duì)LOH進(jìn)行垃圾回收時(shí)不會(huì)壓縮內(nèi)存!更進(jìn)一步,LOH上空間的使用方式也很特殊——當(dāng)分配一個(gè)大對(duì)象時(shí),運(yùn)行時(shí)會(huì)優(yōu)先嘗試在LOH的尾部進(jìn)行分配,如果尾部空間不足,就會(huì)嘗試向操作系統(tǒng)請(qǐng)求更多的內(nèi)存空間,只有在這一步也失敗時(shí),才會(huì)重新搜索之前無效對(duì)象留下的內(nèi)存空隙。如下圖所示:

從上到下看

1.LOH中已經(jīng)存在一個(gè)大小為85K的對(duì)象和一個(gè)大小為16M對(duì)象,當(dāng)需要分配另外一個(gè)大小為85K的對(duì)象時(shí),會(huì)在尾部分配空間;

2.此時(shí)發(fā)生了一次垃圾回收,大小為16M的對(duì)象被回收,其占用的空間為未使用狀態(tài),但運(yùn)行時(shí)并沒有對(duì)LOH進(jìn)行壓縮;

3.此時(shí)再分配一個(gè)大小為16.1M的對(duì)象時(shí),分嘗試在LOH尾部分配,但尾部空間不足。所以,

4.運(yùn)行時(shí)向操作系統(tǒng)請(qǐng)求額外的內(nèi)存,并將對(duì)象分配在尾部;

5.此時(shí)如果再需要分配一個(gè)大小為85K的對(duì)象,則優(yōu)先使用尾部的空間。

所以前面的示例代碼會(huì)造成LOH變成下面這個(gè)樣子,當(dāng)最后要分配16M + N的內(nèi)存時(shí),因?yàn)榍懊嬉呀?jīng)沒有任何一塊連續(xù)區(qū)域滿足要求時(shí),所以就會(huì)引發(fā)OutOfMemoryExceptiojn異常。

 

要解決這一問題其實(shí)并不容易,但可以考慮下面的策略。 

#p#

1.將比較大的對(duì)象分割成較小的對(duì)象,使每個(gè)小對(duì)象大小小于85, 000字節(jié),從而不再分配在LOH上;

2.盡量“重用”少量的大對(duì)象,而不是分配很多大對(duì)象;

3.每隔一段時(shí)間就重啟一下程序。

最終我們發(fā)現(xiàn),我們的軟件中使用數(shù)組(List<float>)保存了一些曲線數(shù)據(jù),而這些曲線的大小很可能會(huì)超過了85, 000字節(jié),同時(shí)曲線對(duì)象的個(gè)數(shù)也非常多,從而對(duì)LOH造成了很大的壓力,甚至出現(xiàn)了文章開頭所描述的情況。針對(duì)這一情況,我們采用了策略1的方法,定義了一個(gè)類似C++中deque的數(shù)據(jù)結(jié)構(gòu),它以分塊內(nèi)存的方式存儲(chǔ)數(shù)據(jù),而且保證每一塊的大小都小于85, 000,從而解決了這一問題。

此外要說的是,不要以為64位環(huán)境中可以忽略這一問題。雖然64位環(huán)境下有更大的內(nèi)存空間,但對(duì)于操作系統(tǒng)來說,.NET中的LOH會(huì)提交很大范圍的內(nèi)存區(qū)域,所以當(dāng)存在大量的內(nèi)存空隙時(shí),即使不會(huì)出現(xiàn)OutOfMemoryException異常,也會(huì)使得內(nèi)頁頁面交換的頻率不斷上升,從而使軟件運(yùn)行的越來越慢。

最后分享我們定義的分塊列表,它對(duì)IList<T>接口的實(shí)現(xiàn)行為與List<T>相同,代碼中只給出了比較重要的幾個(gè)方法。

  1. public class BlockList<T> : IList<T>  
  2.  {  
  3.      private static int maxAllocSize;  
  4.      private static int initAllocSize;  
  5.      private T[][] blocks;  
  6.      private int blockCount;  
  7.      private int[] blockSizes;  
  8.      private int version;  
  9.      private int countCache;  
  10.      private int countCacheVersion;  
  11.    
  12.      static BlockList()  
  13.      {  
  14.          var type = typeof(T);  
  15.          var size = type.IsValueType ? Marshal.SizeOf(default(T)) : IntPtr.Size;  
  16.          maxAllocSize = 80000 / size;  
  17.          initAllocSize = 8;  
  18.      }  
  19.    
  20.      public BlockList()  
  21.      {  
  22.          blocks = new T[8][];  
  23.          blockSizes = new int[8];  
  24.          blockCount = 0;  
  25.      }  
  26.    
  27.      public void Add(T item)  
  28.      {  
  29.          int blockId = 0, blockSize = 0;  
  30.          if (blockCount == 0)  
  31.          {  
  32.              UseNewBlock();  
  33.          }  
  34.          else 
  35.          {  
  36.              blockId = blockCount - 1;  
  37.              blockSize = blockSizes[blockId];  
  38.              if (blockSize == blocks[blockId].Length)  
  39.              {  
  40.                  if (!ExpandBlock(blockId))  
  41.                  {  
  42.                      UseNewBlock();  
  43.                      ++blockId;  
  44.                      blockSize = 0;  
  45.                  }  
  46.              }  
  47.          }  
  48.    
  49.          blocks[blockId][blockSize] = item;  
  50.          ++blockSizes[blockId];  
  51.          ++version;  
  52.      }  
  53.    
  54.      public void Insert(int index, T item)  
  55.      {  
  56.          if (index > Count)  
  57.          {  
  58.              throw new ArgumentOutOfRangeException("index");  
  59.          }  
  60.    
  61.          if (blockCount == 0)  
  62.          {  
  63.              UseNewBlock();  
  64.              blocks[0][0] = item;  
  65.              blockSizes[0] = 1;  
  66.              ++version;  
  67.              return;  
  68.          }  
  69.    
  70.          for (int i = 0; i < blockCount; ++i)  
  71.          {  
  72.              if (index >= blockSizes[i])  
  73.              {  
  74.                  index -= blockSizes[i];  
  75.                  continue;  
  76.              }  
  77.    
  78.              if (blockSizes[i] < blocks[i].Length || ExpandBlock(i))  
  79.              {  
  80.                  for (var j = blockSizes[i]; j > index; --j)  
  81.                  {  
  82.                      blocks[i][j] = blocks[i][j - 1];  
  83.                  }  
  84.    
  85.                  blocks[i][index] = item;  
  86.                  ++blockSizes[i];  
  87.                  break;  
  88.              }  
  89.    
  90.              if (i == blockCount - 1)  
  91.              {  
  92.                  UseNewBlock();  
  93.              }  
  94.    
  95.              if (blockSizes[i + 1] == blocks[i + 1].Length  
  96.                  && !ExpandBlock(i + 1))  
  97.              {  
  98.                  UseNewBlock();  
  99.                  var newBlock = blocks[blockCount - 1];  
  100.                  for (int j = blockCount - 1; j > i + 1; --j)  
  101.                  {  
  102.                      blocks[j] = blocks[j - 1];  
  103.                      blockSizes[j] = blockSizes[j - 1];  
  104.                  }  
  105.    
  106.                  blocks[i + 1] = newBlock;  
  107.                  blockSizes[i + 1] = 0;  
  108.              }  
  109.    
  110.              var nextBlock = blocks[i + 1];  
  111.              var nextBlockSize = blockSizes[i + 1];  
  112.              for (var j = nextBlockSize; j > 0; --j)  
  113.              {  
  114.                  nextBlock[j] = nextBlock[j - 1];  
  115.              }  
  116.    
  117.              nextBlock[0] = blocks[i][blockSizes[i] - 1];  
  118.              ++blockSizes[i + 1];  
  119.    
  120.              for (var j = blockSizes[i] - 1; j > index; --j)  
  121.              {  
  122.                  blocks[i][j] = blocks[i][j - 1];  
  123.              }  
  124.    
  125.              blocks[i][index] = item;  
  126.              break;  
  127.          }  
  128.    
  129.          ++version;  
  130.      }  
  131.    
  132.      public void RemoveAt(int index)  
  133.      {  
  134.          if (index < 0 || index >= Count)  
  135.          {  
  136.              throw new ArgumentOutOfRangeException("index");  
  137.          }  
  138.    
  139.          for (int i = 0; i < blockCount; ++i)  
  140.          {  
  141.              if (index >= blockSizes[i])  
  142.              {  
  143.                  index -= blockSizes[i];  
  144.                  continue;  
  145.              }  
  146.    
  147.              if (blockSizes[i] == 1)  
  148.              {  
  149.                  for (int j = i + 1; j < blockCount; ++j)  
  150.                  {  
  151.                      blocks[j - 1] = blocks[j];  
  152.                      blockSizes[j - 1] = blockSizes[j];  
  153.                  }  
  154.    
  155.                  blocks[blockCount - 1] = null;  
  156.                  blockSizes[blockCount - 1] = 0;  
  157.                  --blockCount;  
  158.              }  
  159.              else 
  160.              {  
  161.                  for (int j = index + 1; j < blockSizes[i]; ++j)  
  162.                  {  
  163.                      blocks[i][j - 1] = blocks[i][j];  
  164.                  }  
  165.    
  166.                  blocks[i][blockSizes[i] - 1] = default(T);  
  167.                  --blockSizes[i];  
  168.              }  
  169.    
  170.              break;  
  171.          }  
  172.    
  173.          ++version;  
  174.      }  
  175.    
  176.      private bool ExpandBlock(int blockId)  
  177.      {  
  178.          var length = blocks[blockId].Length;  
  179.          if (length == maxAllocSize)  
  180.          {  
  181.              return false;  
  182.          }  
  183.    
  184.          length = Math.Min(length * 2, maxAllocSize);  
  185.          Array.Resize(ref blocks[blockId], length);  
  186.          return true;  
  187.      }  
  188.    
  189.      private void UseNewBlock()  
  190.      {  
  191.          if (blockCount == blocks.Length)  
  192.          {  
  193.              Array.Resize(ref blocks, blockCount * 2);  
  194.              Array.Resize(ref blockSizes, blockCount * 2);  
  195.          }  
  196.    
  197.          blocks[blockCount] = new T[initAllocSize];  
  198.          blockSizes[blockCount] = 0;  
  199.          ++blockCount;  
  200.      }  
  201.  } 

原文鏈接:http://www.cnblogs.com/brucebi/archive/2013/04/16/3024136.html

責(zé)任編輯:張偉 來源: 博客園
相關(guān)推薦

2010-06-03 13:00:37

DNS故障

2014-07-29 09:16:14

Fragment

2009-06-08 20:05:14

Eclipse deb

2022-10-14 09:12:59

參數(shù)Python類型

2022-03-05 00:08:52

網(wǎng)絡(luò)安全交易

2025-04-02 00:00:04

2015-08-11 08:51:40

游戲死亡

2023-02-08 16:29:58

前后端開發(fā)

2023-03-14 07:23:48

ReactJSX語法

2025-03-05 10:00:00

.NET 9C#開發(fā)

2021-07-08 23:53:44

Go語言拷貝

2020-09-09 07:55:51

TS開源符號(hào)

2021-02-02 16:34:12

useMemo性能優(yōu)化函數(shù)

2018-01-24 18:00:21

LinuxDebianvim

2009-06-01 14:54:50

jpaapiJava

2017-10-20 10:19:49

Kotlin語言陷阱

2019-07-10 09:12:20

程序員級(jí)別跳槽

2019-09-11 10:09:00

Java虛擬機(jī)算法

2023-06-26 00:03:55

Go語言類型

2011-04-14 13:52:27

ArrayList
點(diǎn)贊
收藏

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

国产区一区二| 国产毛片一区二区三区va在线| 亚洲欧美日本国产| 亚洲午夜久久久久中文字幕久| 99精彩视频在线观看免费| 国产无套在线观看| 日韩精品导航| 欧美日韩国产美| www婷婷av久久久影片| 深爱激情五月婷婷| 日本不卡一二三区黄网| 久久91精品国产91久久久| 久久人妻一区二区| 日韩成人精品一区二区三区| 亚洲国产毛片aaaaa无费看| 欧洲精品在线一区| www.天天干.com| 老妇喷水一区二区三区| 欧美日韩国产成人| 久久亚洲无码视频| 国产精品色在线网站| 欧美午夜一区二区三区免费大片| 欧美一区二区三区综合| 国产黄在线观看免费观看不卡| 国产福利一区二区| 国产精品第10页| 日本一级黄色大片| 亚洲精品极品少妇16p| 亚洲人成在线观| 日本一级大毛片a一| 欧美一级做一级爱a做片性| 精品福利在线看| 日本三级中文字幕在线观看| 国产在线91| k8久久久一区二区三区| 成人久久18免费网站图片| 91午夜精品亚洲一区二区三区| 午夜亚洲福利| 久久精品视频亚洲| 99久久99久久精品免费看小说. | 亚洲成人免费观看| 国产91porn| 3p视频在线观看| 久久日一线二线三线suv| 国产精品一 二 三| 亚洲va欧美va| 国产福利精品一区二区| 成人在线播放av| 一本色道久久综合熟妇| 日韩av成人高清| 国产精品高潮呻吟久久av无限| 国产三级av片| 亚洲免费婷婷| 欧美怡春院一区二区三区| 国产精品9191| 亚洲日产国产精品| 久久全球大尺度高清视频| 中文字幕av免费在线观看| 99精品美女| 久久综合久久美利坚合众国| 日本一级片免费| 久久精品影视| 九九久久综合网站| 久久久精品国产sm调教网站| 自拍偷拍欧美| 欧美福利小视频| 国产在线综合网| 亚洲美女少妇无套啪啪呻吟| …久久精品99久久香蕉国产| 日本韩国欧美中文字幕| 日一区二区三区| 国产精品视频不卡| 国产三级在线观看视频| 国产91精品免费| 国内精品视频免费| 无码精品一区二区三区在线| 91蝌蚪porny| 午夜精品短视频| 免费网站成人| 亚洲一区二区三区国产| 人人干视频在线| 不卡一二三区| 欧美日韩精品欧美日韩精品| 中文字幕亚洲日本| 久久亚州av| 一区二区在线视频播放| 国产精品白丝喷水在线观看| 黄色日韩在线| 国产成人精品a视频一区www| 91影院在线播放| 成人一道本在线| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 色素色在线综合| 五月天丁香花婷婷| 欧美aaaaa级| 最好看的2019年中文视频| 欧美成人一二三区| 久久国产免费| 444亚洲人体| 国产日韩精品在线看| ㊣最新国产の精品bt伙计久久| 国产色一区二区三区| 成人做爰免费视频免费看| 欧美成人video| www..com.cn蕾丝视频在线观看免费版| 久久久久国产精品| 5566成人精品视频免费| 国产免费的av| 国产三级欧美三级日产三级99 | 国产精品乱码| aaa日本高清在线播放免费观看| 一区二区三区在线免费视频| 国产成人无码av在线播放dvd| 国产精品日本一区二区不卡视频| 日韩国产在线看| 欧美黄色aaa| 日本中文字幕一区二区视频| 国产一区二区三区无遮挡| 免费网站看v片在线a| 一本到不卡精品视频在线观看| 国产探花在线观看视频| 国产91久久精品一区二区| 欧美精品videofree1080p| 中文字幕在线观看第二页| 99久久精品一区二区| 裸体裸乳免费看| 黄色精品视频| 亚洲人成网站在线播| 日本一区二区欧美| 国产一区91精品张津瑜| 亚洲精品人成| 日韩精品影院| 亚洲欧美制服另类日韩| 国产污片在线观看| 国产精品一卡二| 一区二区三区四区不卡| 成人软件在线观看| 日韩成人在线免费观看| 久久久久99精品| 丰满岳乱妇一区二区三区| 中文有码久久| 欧美美女福利视频| 中文字幕av一区中文字幕天堂| 国产高清中文字幕| 91日韩一区二区三区| 9久久9毛片又大又硬又粗| 伊人精品综合| 欧美激情二区三区| 亚洲AV无码一区二区三区少妇| 亚洲同性同志一二三专区| 日本三级黄色网址| 久久亚洲在线| 成人激情黄色网| 黄视频在线观看网站| 在线播放中文一区| 午夜激情福利网| 国产一区二区福利视频| 日日噜噜夜夜狠狠久久丁香五月| www.成人| 欧美肥婆姓交大片| 亚洲精品国产精品国| 亚洲第一主播视频| 亚洲黄色免费在线观看| 国产精品久久久久久久免费软件| 久久久久一区二区| 男人最爱成人网| 中文字幕欧美视频在线| 亚洲一区二区久久| 911国产在线| 国产真实精品久久二三区| 一二三四中文字幕| 国产一区二区三区亚洲| 欧美整片在线观看| 91视频91自| 亚洲网站视频| 91在线视频导航| 污影院在线观看| 亚洲国产精品va在线| 国产又黄又粗又爽| 国产蜜臀97一区二区三区 | 国产精品久久久久久模特| 久久久久久久有限公司| 亚洲a∨精品一区二区三区导航| 日韩专区中文字幕| 国产91麻豆视频| 日韩人体视频一二区| 人与动物性xxxx| 成人午夜视频在线| 精品国产av无码一区二区三区| 亚洲免费专区| 成人精品网站在线观看| 白白色在线观看| 亚洲视频在线免费观看| 国产精品一品二区三区的使用体验| 樱桃视频在线观看一区| 国产精品无码午夜福利| 久久99国产精品麻豆| 欧美午夜性视频| 不卡中文一二三区| 国产精品二区二区三区| 欧美xxxx做受欧美护士| 久久久91精品国产一区不卡| 五月婷婷丁香网| 欧美男女性生活在线直播观看| 精品视频久久久久| 国产日产欧美一区二区三区 | 草民电影神马电影一区二区| 久久99精品国产99久久6尤物| 欧美日韩国产综合视频| 91精品国产福利在线观看| 国产成人在线免费视频| 最近中文字幕一区二区三区| 国产美女视频免费观看下载软件| 黑人精品欧美一区二区蜜桃| 国产午夜伦鲁鲁| 欧美+日本+国产+在线a∨观看| 日本一区二区视频| 成人春色在线观看免费网站| 国产日韩专区在线| 亚洲国产欧美日本视频| 久久99国产精品自在自在app| 成人激情五月天| 青青草手机在线| 欧美午夜激情在线| 亚洲色婷婷一区二区三区| 久久免费的精品国产v∧| 丰满饥渴老女人hd| 久久99久久精品欧美| 日韩免费高清在线| 亚洲深夜av| 六月婷婷激情综合| 91偷拍一区二区三区精品| 欧美日韩国产不卡在线看| 黄色网一区二区| 91嫩草在线| 91麻豆精品国产综合久久久| 国产成人亚洲综合91精品| sm久久捆绑调教精品一区| 欧美成人精品一区二区三区| 在线观看h片| 亚洲性69xxxbbb| 欧美巨乳在线| 亚洲美女在线看| 天堂在线视频免费观看| 欧美xxxxxxxx| av资源免费看| 日韩一区二区精品葵司在线 | 久久三级福利| 欧美三级午夜理伦三级| 新狼窝色av性久久久久久| 91九色丨porny丨国产jk| 国自产拍偷拍福利精品免费一| 黄色网络在线观看| 亚洲高清资源在线观看| 中文字幕一区二区三区在线乱码| 久久日文中文字幕乱码| 中国成人亚色综合网站| 999国产精品| 桥本有菜av在线| 一个色综合网| 2022中文字幕| 99人久久精品视频最新地址| 久艹视频在线免费观看| 国产精品日韩精品欧美精品| 男人添女人下面高潮视频| 亚洲永久字幕| 超碰影院在线观看| 青青青伊人色综合久久| www.污污视频| 懂色av一区二区三区蜜臀| 亚洲成年人在线观看| k8久久久一区二区三区| 六月婷婷七月丁香| 中文字幕国产一区二区| 亚洲国产123| 亚洲一区二区三区四区五区黄| 日韩av在线电影| 日韩欧美黄色动漫| 一本一道精品欧美中文字幕| 91精品国产综合久久久久久| 性生活视频软件| 日韩久久免费视频| 香蕉视频免费在线播放| 欧美久久久精品| 97久久国产亚洲精品超碰热| 日韩精品看片| 乱子伦一区二区| 99在线精品视频在线观看| 久久精品午夜福利| 精品一区二区成人精品| 国产艳妇疯狂做爰视频| 国产视频视频一区| 黄色一级片中国| 欧美性猛交xxxx乱大交蜜桃| 亚洲图片小说视频| 精品剧情在线观看| 国产污视频在线| 欧美成在线视频| 欧美精品日日操| 91精品国产高清久久久久久91裸体| 老汉色老汉首页av亚洲| 日本最新一区二区三区视频观看| 亚洲国产日韩欧美在线| 黄色一级在线视频| 久久 天天综合| 欧美深性狂猛ⅹxxx深喉| 综合色中文字幕| 男人天堂视频网| 欧美大胆一级视频| 成人福利在线| 国内精品久久影院| 粉嫩一区二区三区在线观看| 精品一区二区三区日本| 久久精品亚洲人成影院 | 日本片在线观看| 国产欧美亚洲视频| 老司机精品在线| ijzzijzzij亚洲大全| 日韩电影在线一区二区三区| 天天躁日日躁狠狠躁av麻豆男男 | 神马影院一区二区三区| 亚洲国产精品一区制服丝袜| av噜噜在线观看| 国产欧美一区二区三区沐欲| 日韩av女优在线观看| 91精品国产综合久久精品性色 | 久久aimee| 国产一二三四五| 另类人妖一区二区av| 久久久久久久久久久久久久久| 亚洲高清免费视频| av网站免费播放| 精品国产拍在线观看| 国精产品一区二区三区有限公司| 国产精品一区二区三区四区五区| 亚洲国产精品91| 天堂av2020| 国产精品色噜噜| 在线视频精品免费| 亚洲网站在线看| 成人性生活视频| 久久精品一二三区| 亚洲看片一区| 黄色国产在线观看| 欧美视频在线视频| 污视频在线免费观看| 久久久久久亚洲| 国产一区二区三区亚洲| 麻豆tv在线播放| 不卡视频一二三| 国产黄色片免费看| 日韩经典中文字幕| 一区二区三区电影大全| 久久久精彩视频| 久久综合图片| 非洲一级黄色片| 在线观看视频欧美| 一广人看www在线观看免费视频| 国产精品国语对白| 久久影院一区| 在线一区二区不卡| 成人免费一区二区三区在线观看| 97av免费视频| 欧美www在线| 久久精品国产亚洲blacked| 久久久性生活视频| www久久久久| 亚洲 欧美 中文字幕| 最近中文字幕日韩精品| 青青久久精品| 国产内射老熟女aaaa| 白白色亚洲国产精品| 日韩特级黄色片| 夜夜嗨av一区二区三区免费区| 91在线亚洲| 久久精品在线免费视频| 9久草视频在线视频精品| 91精品国产综合久久久蜜臀九色| 中日韩美女免费视频网址在线观看| 欧美美女福利视频| 日韩精品久久一区二区| 91伊人久久大香线蕉| 日韩不卡高清视频| 欧美成人精品三级在线观看| 国偷自产av一区二区三区| 人妻无码视频一区二区三区| 亚洲欧洲日产国码二区| 亚洲女人18毛片水真多| 国产91在线播放精品91| 国产精品国产三级国产在线观看 | 操日韩av在线电影| 国产成人av毛片| caoporn超碰97| 一区二区三区国产| 国产有码在线| 国产精品国产精品国产专区蜜臀ah | www.爱久久.com| 久久午夜鲁丝片| 久久理论片午夜琪琪电影网| jiujiure精品视频播放|