欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

解讀.net垃圾回收和CLR 4.0對垃圾回收所做的改進之二_.Net教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:如何改變.net網站的默認解決方案位置
1. 把該網站以前的解凍方案刪除(默認位置:我的文檔\Visual Studio 2005\Projects\XX\xx.sln) 2. 打開VS2005,選擇

A survey of garbage collection and the changes CLR 4.0 brings in Part 2 - series of what is new in CLR 4.0

接前篇Continue the previous post .net垃圾回收和CLR 4.0對垃圾回收所做的改進之一

CLR4.0所帶來的變化仍然沒有在這篇,請看下篇。

內存釋放和壓縮

創建對象引用圖之后,垃圾回收器將那些沒有在這個圖中的對象(即不再需要的對象)釋放。釋放內存之后, 出現了內存碎片, 垃圾回收器掃描托管堆,找到連續的內存塊,然后移動未回收的對象到更低的地址, 以得到整塊的內存,同時所有的對象引用都將被調整為指向對象新的存儲位置。這就象一個夯實的動作。

After building up the reference relationship graph, garbage collector reclaims the objects not in the graph(no longer needed), after releasing the objects not in the graph, there is memory scrap. Garbage collector scans the managed heap to find continous memory block, and shifts the remaining objects to lower address to get consecutive memory space, and then adjusts the references of objects according to the shifted address of objects. This is looking like a tamping on the managed heap.

下面要說到的是代的概念。代概念的引入是為了提高垃圾收集器的整體性能。We come to the concept of generations next. The importing of generation concept is to improve the performance of garbage collector.

代Generations

請想一想如果垃圾收集器每次總是掃描所有托管堆中的對象,對性能會有什么影響。會不會很慢?是的。微軟因此引入了代的概念。

Please think about what will happen if garbage collector scans all the objects in the whole heap in every garbage collecting cycle. Will it be very slow? Yes, therefore Microsoft imported the concept of generations.

為什么代的概念可以提高垃圾收集器的性能?因為微軟是基于對大量編程實踐的科學估計,做了一些假定而這些假定符合絕大多數的編程實踐:

Why generation concept can help improve performance of garbage collector? Because Microsoft did scientific valuation on mass of programming practice, and made assumptions and the assumptions conform to most of programming practice:

越新的對象,其生命周期越短。The newer an object is, the shorter its lifetime will be.

越老的對象,其生命周越長。The older an object is, the longer its lifetime will be.

新對象之間通常有強的關系并被同時訪問。Newer objects tend to have strong relationships to each other and are frequently accessed around the same time.

壓縮一部分堆比壓縮整個堆快。Compacting a portion of the heap is faster than compacting the whole heap.

有了代的概念,垃圾回收活動就可以大部分局限于一個較小的區域來進行。這樣就對垃圾回收的性能有所提高。After importing the concept of generations, most of garbage collecting will be limited in in smaller range of memory. This enhances the performance of garbage collector.

讓我們來看垃圾收集器具體是怎么實現代的: Let’s see how generations are exactly implemented in garbage collector:
第0代:新建對象和從未經過垃圾回收對象的集合 Generation 0: A collection of newly created object and the objects never collected.
第1代:在第0代收集活動中未回收的對象集合 Generation 1: A collection of objects not collected by garbage collector in collecting cycle of generation 0.
第2代:在第1和第2代中未回收的對象集合, 即垃圾收集器最高只支持到第2代, 如果某個對象在第2代的回收活動中留下來,它仍呆在第2代的內存中。 Generation 2: A collection of objects not collected by garbage collector in generation 1 and generation 2. This means the highest generation that garbage collector supports is generation 2. If an object survives in generation 2 collecting cycle, it still remains in memory of generation 2.
當程序剛開始運行,垃圾收集器分配為每一代分配了一定的內存,這些內存的初始大小由.net framework的策略決定。垃圾收集器記錄了這三代的內存起始地址和大小。這三代的內存是連接在一起的。第2代的內存在第1代內存之下,第1代內存在第0代內存之下。應用程序分配新的托管對象總是從第0代中分配。如果第0代中內存足夠,CLR就很簡單快速地移動一下指針,完成內存的分配。這是很快速的。當第0代內存不足以容納新的對象時,就觸發垃圾收集器工作,來回收第0代中不再需要的對象,當回收完畢,垃圾收集器就夯實第0代中沒有回收的對象至低的地址,同時移動指針至空閑空間的開始地址(同時按照移動后的地址去更新那些相關引用),此時第0代就空了,因為那些在第0代中沒有回收的對象都移到了第1代。
When the program initializes, garbage collector allocates memory for generations. The initial size of memory blocks are determined according to the strategies of the .net framework. Garbage collector records the start address and size of the memory block for generations. The memory blocks of generations are continuous and adjacent. The memory of generation 2 is under the memory of generation 1, and the memory of generation 1 is under the memory of generation 0. CLR always allocates memory for new objects in generation 0. If there is enough memory in generation 0, CLR simply moves the pointer to allocate memory. This is really fast. When there is not enough memory in generation 0 to accommodate new objects, CLR triggers garbage collector starts to collect objects no longer needed from generation 0. When the collecting action in generation 0 finishs, garbage collector tamps(or compacts) the objects not collected in generation 0 to lower address, and moves the pointer to start address of free memory(and updates the related references according to the shifted address of objects). At this time, generation 0 is empty, because the objects survived in generation 0 are moved to generation 1.
當只對第0代進行收集時,所發生的就是部分收集。這與之前所說的全部收集有所區別(因為代的引入)。對第0代收集時,同樣是從根開始找那些正引用的對象,但接下來的步驟有所不同。當垃圾收集器找到一個指向第1代或者第2代地址的根,垃圾收集器就忽略此根,繼續找其他根,如果找到一個指向第0代對象的根,就將此對象加入圖。這樣就可以只處理第0代內存中的垃圾。這樣做有個先決條件,就是應用程序此前沒有去寫第1代和第2代的內存,沒有讓第1代或者第2代中某個對象指向第0代的內存。但是實際中應用程序是有可能寫第1代或者第2代的內存的。針對這種情況,CLR有專門的數據結構(Card table)來標志應用程序是否曾經寫第1代或者第2代的內存。如果在此次對第0代進行收集之前,應用程序寫過第1代或者第2代的內存,那些被Card Table登記的對象(在第1代或者第2代)將也要在此次對第0代收集時作為根。這樣,才可以正確地對第0代進行收集。
When collecting generation 0 only, it is partial collection. It is different from full collection mentioend earlier(because of the generations). When collecting generation 0, garbage collector starts from the roots, which is the same as the full collection, but it is different in coming steps. When garbage collector finds a root pointing to an address of generation 1 or 2, garbage collector ignores the root, and goes to next root. If garbage collector finds a root pointing to an object of generation 0, garbage collector addes the object into the graph. That way garbage collector processes the objects of generation 0 only. There is a pre-condition to do that. It is that the application does not write to the memory of generation 1 and 2, does not allow some objects of generation 1 or 2 refer to the memory of generation 0. But in our daily work, the applicaiton is possible to write the memory of generation 1 or 2. In this case, CLR has a dedicated data structure called Card Table to record whether the application writes the memory of generation 1 or 2. If the application writes the memory of generation 1 or 2 before the collecting on generation 0, the objects recorded by the Card Table will become roots during the collecting on generation 0. Garbage collection on generation 0 can be done correctly in this case.
以上說到了第0代收集發生的一個條件,即第0代沒有足夠內存去容納新對象。執行GC.Collect()也會觸發對第0代的收集。另外,垃圾收集器還為每一代都維護著一個監視閥值。第0代內存達到這個第0代的閥值時也會觸發對第0代的收集。對第1代的收集發生在執行GC.Collect(1)或者第1代內存達到第1代的閥值時。第2代也有類似的觸發條件。當第1代收集時,第0代也需要收集。當第2代收集時,第1和第0代也需要收集。在第n代收集之后仍然存留下來的對象將被轉移到第n+1代的內存中,如果n=2, 那么存留下來的對象還將留在第2代中。
We mentioned a criteria to trigger collecting on generation 0 in above paragraphs: generation 0 does not have enough memory to accommodate new objects. When execute GC.Collect(), it launches collecting on generation 0 also. In addition, garbage collector sets up a threshold for each of generations. When the memory of generation 0 reaches the threshold, collecting on generation 0 happens also. Collecting on generation 1 happens when executing GC.Collect() or the memory of generation 1 reaches the threshold of generation 1. Generation 2 has similar trigger conditions. When collecting on generation 1, collecting on generation 0 happens also. When collecting on generation 2, collecting on generation 1 and 0 happen also. The survived object in collecting generation n will be moved to the memory of generation n+1. If n=2, the remaining objects still stay in generation 2.
對象結束Finalization of objects
對象結束機制是程序員忘記用Close或者Dispose等方法清理申請的資源時的一個保證措施。如下的一個類,當一個此類的實例創建時,在第0代中分配內存,同時此對象的引用要被加入到一個由CLR維護的結束隊列中去。
Finalization is an ensuring mechanism when programmers forget to use Close or Dispose method to clean up resources. For exmaple, a class like the following, when an instane of the class is created, it is allocated in memory of generation 0, and a reference of the object is appended to Finalization quere maintained by CLR.
public class BaseObj {
    public BaseObj() { } 
    protected override void Finalize() {
        // Perform resource cleanup code here...
        // Example: Close file/Close network connection
        Console.WriteLine("In Finalize.");
    }
}
當此對象成為垃圾時,垃圾收集器將其引用從結束隊列移到待結束隊列中,同時此對象會被加入引用關系圖。一個獨立運行的CLR線程將一個個從待結束隊列(Jeffrey Richter稱之為Freachable quere)取出對象,執行其Finalize方法以清理資源。因此,此對象不會馬上被垃圾收集器回收。只有當此對象的Finalize方法被執行完畢后,其引用才會從待結束隊列中移除。等下一輪回收時,垃圾回收器才會將其回收。
When the object becomes garbage, garbage collector moves the reference from Finalization queue to ToBeFinalized queue(Jeffrey Richter called it Freachable queue), and appends the object to the reference graph. A standalone thread of CLR will fetch objects from the ToBeFinalized queue one by one, and execute the Finalize() method of objects to clean up resources. Therefore, the object will not be collected right away by garbage collector. After the Finalize() method is executed, its reference will be removed from the ToBeFinalizaed queue. When next collecting comes, garbage collector reclaims its memory.
GC類有兩個公共靜態方法GC.ReRegisterForFinalize和GC.SuppressFinalize大家也許想了解一下,ReRegisterForFinalize是將指向對象的引用添加到結束隊列中(即表明此對象需要結束),SuppressFinalize是將結束隊列中該對象的引用移除,CLR將不再會執行其Finalize方法。
There are two public static methods of GC class you guys may want to know: GC.ReRegisterForFinalize and GC.SuppressFinalize. ReRegisterForFinalize is to append the reference of objects to finalization queue(meaning the objects need to be finalized), SuppressFinalize is to remove the reference of objects from finalization queue, then CLR would not execute the Finalize method of the object.
因為有Finalize方法的對象在new時就自動會加入結束隊列中,所以ReRegisterForFinalize可以用的場合比較少。ReRegisterForFinalize比較典型的是配合重生(Resurrection)的場合來用。重生指的是在Finalize方法中讓根又重新指向此對象。那么此對象又成了可到達的對象,不會被垃圾收集器收集,但是此對象的引用未被加入結束隊列中。所以此處需要用ReRegisterForFinalize方法來將對象的引用添加到結束隊列中。因為重生本身在現實應用中就很少見,所以ReRegisterForFinalize也將比較少用到。
Because the objects with Finalize method will be appended to Finalization queue when new operation, there are few scenarios to use ReRegisterForFinalize method. A typical scenario is to use ReRegisterForFinalize with Resurrection. Resurrection is that we let a root pointing to the object again in Finalize method, and then the object becomes reachable again, therefore it will be not collected by garbage collector. But the reference of the object has not been appended to Finalization queue, therefore we can use ReRegisterForFinalize to append the object to Finalization queue. Because there are few requirement in reality to use resurrection, ReRegisterForFinalize will have be used in low rate.
相比之下,SuppressFinalize更常用些。SuppressFinalize用于同時實現了Finalize方法和Dispose()方法來釋放資源的情況下。在Dispose()方法中調用GC.SuppressFinalize(this),那么CLR就不會執行Finalize方法。Finalize方法是程序員忘記用Close或者Dispose等方法清理資源時的一個保證措施。如果程序員記得調用Dispose(),那么就會不執行Finalize()來再次釋放資源;如果程序員忘記調用Dispose(), Finalize方法將是最后一個保證資源釋放的措施。這樣做不失為一種雙保險的方案。
Compare to ReRegisterForFinalize, SuppressFinalize has more frequent utilization. When we implement both Finalize method and Dispose method to release resources, we need to use SuppressFinalize method. Call GC.SuppressFinalize(this) in Dispose() method body and then CLR will execute the Finalize method. Finalization is an ensuring mechanism when programmers forget to use Close or Dispose method to clean up resources. If programmers do call Dispose(), then CLR will not call Finalize method to release resources again. If programmers forget to call Dispose(), then Finalize method will be the final ensuring mechnism for resource releasing. That way it is dual fail-safe solution.
對象結束機制對垃圾收集器的性能影響比較大,同時CLR難以保證調用Finalize方法的時間和次序。因此,盡量不要用對象結束機制,而采用自定義的方法或者名為Close, Dispose的方法來清理資源。可以考慮實現IDisposable接口并為Dispose方法寫好清理資源的方法體。
Finalization has significant impact on performance of garbage collector, and CLR can not be sure on the order to call Finalize methods of objects, therefore please do not use finalization of objects as possible as you can, instead, you could use self defined methods, Close method or Dispose method to clean up resources. Please think about to implement the IDisposable interface and write method body for the Dispose method.
大對象堆Large object heap
大對象堆專用于存放大于85000字節的對象。初始的大對象內存區域堆通常在第0代內存之上,并且與第0代內存不鄰接。第0,第1和第2代合起來稱為小對象堆。CLR分配一個新的對象時,如果其大小小于85000字節,就在第0代中分配,如果其大小大于等于85000自己,就在大對象堆中分配。
Large object heap is to store objects that its size is over 85000 bytes. The initial memory block is above the memory block of generation 0, and it is not adjacent to memory block of generation 0. Generation 0,1 and 2 is called small object heap. When CLR allocates a new object, if its size is lower than 85000 bytes, then allocates memory in generation 0; If its size is over 85000 bytes, then allocates memory in large object heap.
因為大對象的尺寸比較大,收集時成本比較高,所以對大對象的收集是在第2代收集時。大對象的收集也是從根開始查找可到達對象,那些不可到達的大對象就可回收。垃圾收集器回收了大對象后,不會對大對象堆進行夯實操作(畢竟移動大對象成本較高),而是用一個空閑對象表的數據結構來登記哪些對象的空間可以再利用,其中兩個相鄰的大對象回收將在空閑對象表中作為一個對象對待。空閑對象表登記的空間將可以再分配新的大對象。
Because size of large object is significant, the cost of collection is significant also. Collection of large objects happens when generation 2 collecting. Collection of large objects starts from the roots also and searches for reachable objects. Non-reachable large objects will be collected. After collecting non-reachable large objects, garbage collector will not tamp the large object heap(because the cost of moving a large object is high), instead, garbage collector uses a free object table to record memory ranges can be re-used, if there are two adjacent large object collected, then treats the two large objects as one large object in free object table. The memory ranges in free object table can be re-used by new large objects.
大對象的分配,回收的成本都較小對象高,因此在實踐中最好避免很快地分配大對象又很快回收,可以考慮如何分配一個大對象池,重復利用這個大對象池,而不頻繁地回收。
The cost of allocation and collection of large objects is higher than the cost of allocation and collection of small objects, therefore it would better avoid to allocate large object and release it soon. Please think about allocate a pool of large objects, try to re-use the pool of large objects, do not frequently reclaim large objects.

分享:解決ASP.NET中讓網頁彈出窗口的問題
由于項目要用到彈出窗口,或者叫做模擬窗口,這段時間就研究了下,解決方案很多,比如,window.open();window.showDialog();用層模擬,框架 DIV Javascript.... 用window.open();這種方法的缺點是,會被瀏覽器或者相關軟件給屏蔽掉。用層模擬的話,如果想實

來源:模板無憂//所屬分類:.Net教程/更新時間:2009-07-19
相關.Net教程
欧美视频一二三区| 西西人体一区二区| 亚洲精品亚洲人成人网| 米奇精品一区二区三区在线观看| 蜜臀在线免费观看| 国产成人无码一区二区三区在线| 视频一区中文| 日韩一区在线看| 国外成人免费在线播放| 久久久精品在线视频| 中文人妻熟女乱又乱精品| 91精品综合| 精品久久久一区二区| 国产精品视频午夜| 极品白嫩少妇无套内谢| 日韩一区二区三区免费| 国产高清亚洲一区| 一本色道久久88精品综合| 男同互操gay射视频在线看| 成年人午夜视频| 亚洲国产不卡| 色婷婷精品久久二区二区蜜臂av| 91福利视频导航| 亚洲午夜精品久久久久久高潮| 国产一区二区三区免费在线 | 日本一区二区三区电影免费观看| 91亚洲精品一区二区乱码| 日韩亚洲第一页| 国产l精品国产亚洲区久久| 国产精品一级视频| 日韩av网站在线观看| 欧美不卡在线视频| 香蕉精品视频在线| www.国产毛片| 亚洲国产午夜| 日韩视频一区二区在线观看| 日韩欧美亚洲区| www.国产高清| 亚洲国产高清视频| 欧美一区二区啪啪| 亚洲人久久久| 波多野结衣一本一道| 国产亚洲毛片在线| 亚洲成人网久久久| 伊人再见免费在线观看高清版| 91麻豆精品在线| 久久精品盗摄| 亚洲欧美精品在线| 亚洲熟妇国产熟妇肥婆| 亚洲精品97久久中文字幕| 国产尤物一区二区在线| 日韩中文字幕在线免费观看| 成人午夜激情av| 精品无人乱码一区二区三区| 久久综合999| 欧美综合激情网| 久久人人爽人人人人片| 999在线精品| 一个色妞综合视频在线观看| 亚洲一区二区三区777| 国产探花在线视频| 91精品国产91久久综合| 欧美精品在线观看一区二区| 亚洲一区二区三区免费观看| 一级久久久久久| 日韩国产高清在线| 中文字幕欧美精品日韩中文字幕| 无码少妇一区二区三区芒果| 亚洲电影有码| 国产精品丝袜一区| 成人免费视频97| 丰满少妇被猛烈进入一区二区| 91成人网在线观看| 日韩欧美中文字幕一区| 人妻av无码专区| 蜜臀av中文字幕| 久久午夜国产精品| 国产精品精品视频| 91高清免费看| 在线日韩av| 亚洲欧美日韩精品| 色噜噜狠狠永久免费| 超碰国产精品一区二页| 一区二区三区在线观看欧美| 国产精品亚洲一区| 亚洲精品中文字幕乱码三区91| 久久欧美肥婆一二区| 日韩中文字幕久久| 天堂va欧美va亚洲va老司机| 久久香蕉精品香蕉| 在线观看免费一区| japanese在线播放| 毛片无码国产| 亚洲欧美日韩综合aⅴ视频| 99porn视频在线| 五月天婷婷综合网| 久久超碰97人人做人人爱| 欧美乱人伦中文字幕在线| 少妇一级淫片免费放播放| 日本不卡电影| 日韩一卡二卡三卡国产欧美| 阿v天堂2017| 天天综合在线观看| 亚洲成av人影院| 色综合久久88色综合天天提莫| 国产精品探花视频| 久久这里只有精品首页| 亚洲va欧美va国产综合剧情| 日韩少妇高潮抽搐| 国产一区二区三区久久久| 2019精品视频| 久久r这里只有精品| 丝袜a∨在线一区二区三区不卡| 另类少妇人与禽zozz0性伦| 免费看污黄网站在线观看| 亚洲五月综合| 中文字幕一精品亚洲无线一区| 无码任你躁久久久久久老妇| 999久久久91| 亚洲欧美三级伦理| 欧产日产国产精品98| 亚洲欧洲日韩| 揄拍成人国产精品视频| 亚洲综合自拍网| 午夜欧美理论片| 色噜噜久久综合伊人一本| 国产人妻人伦精品1国产丝袜| 欧美一区成人| 在线亚洲欧美视频| av网站有哪些| 亚洲理论在线| 久久久伊人日本| 青青草免费av| 国产一区二区三区免费在线观看| 日韩美女免费视频| 日韩女优在线观看| 成人aa视频在线观看| 91亚洲va在线va天堂va国| 青青艹在线观看| 久久久www成人免费无遮挡大片| 成人久久18免费网站漫画| 一区二区三区黄色片| 欧美极品美女视频| 日本a级片久久久| 欧美黑人粗大| 色综合天天视频在线观看| 欧美三级一级片| 鲁大师精品99久久久| 精品欧美一区二区三区精品久久| 亚洲欧美日韩一二三区| 99久久综合| 俺去了亚洲欧美日韩| 免费成人深夜天涯网站| 免费美女久久99| 国产精品入口免费视| 最近中文字幕av| 国产精品九色蝌蚪自拍| 亚洲一区三区| 粉嫩av国产一区二区三区| 欧美夫妻性生活| 日韩精品aaa| 欧美激情91| 欧美高清电影在线看| 亚洲国产成人精品综合99| 国产成人av一区二区| av在线不卡一区| 天天综合天天色| 色婷婷久久久亚洲一区二区三区| 国产xxxxx视频| 色777狠狠狠综合伊人| 久久人人爽人人爽爽久久| 欧洲猛交xxxx乱大交3| 成人av动漫在线| 欧美精品七区| 国产精品久久久久久久久久齐齐| 欧美男女性生活在线直播观看| 福利视频999| 激情av一区| 欧美做受高潮1| 成人小视频在线播放| 中文字幕一区免费在线观看| 国产精品jizz在线观看老狼| 51vv免费精品视频一区二区 | av在线免费观看国产| 欧美亚洲色图校园春色| 亚洲人成网站免费播放| 日韩一区二区三区四区视频| 国产成人日日夜夜| 久久综合中文色婷婷| 福利一区二区免费视频| 欧美va亚洲va| 欧美老熟妇乱大交xxxxx| 久久国产精品72免费观看| 国产乱码精品一区二区三区不卡| 欧美人与性动交xxⅹxx| 在线不卡中文字幕| 蜜桃精品成人影片| 国产一区欧美一区| 久久综合一区| 一区二区三区国产好| 精品五月天久久| 久久国产美女视频| 国产亚洲精品福利| 精品人妻大屁股白浆无码| 国产亚洲电影| 欧美黑人性视频| 中文字幕+乱码+中文| 亚洲成a人片在线观看中文| 免费一级特黄录像| 99成人在线| 3d动漫精品啪啪一区二区三区免费 | 久久91精品国产| 欧美日韩在线观看成人| 国产欧美日韩在线观看| 国产精品国产亚洲精品看不卡| 91亚洲国产高清| 日本欧美一级片| 狠狠躁日日躁夜夜躁av| 欧美精品一卡二卡| 国产成人福利在线| 久久亚洲二区三区| 日韩伦理在线免费观看| 91成人超碰| 成人黄色av免费在线观看| 亚洲成人看片| 日韩精品免费一线在线观看| 久久亚洲成人av| 亚洲精品ww久久久久久p站| 久久久精品麻豆| 午夜在线精品| 久久99精品久久久久久三级| 亚洲日本va中文字幕| zzijzzij亚洲日本成熟少妇| 亚洲精品毛片一区二区三区| 色婷婷综合久久久中文一区二区| jjzzjjzz欧美69巨大| 懂色中文一区二区在线播放| 日本免费在线视频观看| 久久中文字幕av一区二区不卡| 日本91av在线播放| 性xxxx搡xxxxx搡欧美| 精品噜噜噜噜久久久久久久久试看 | 国产婷婷色一区二区三区| 2018中文字幕第一页| 你懂的亚洲视频| 91免费在线视频| 免费一级欧美在线观看视频| 中文字幕欧美在线| 狠狠躁夜夜躁人人爽视频| 在线观看一区二区视频| 丰腴饱满的极品熟妇| 国产亚洲精品资源在线26u| 麻豆av免费在线| 日本最新不卡在线| 神马影院午夜我不卡| 欧美一二区在线观看| 国产精品美乳在线观看| 欧美激情福利| 久久中文字幕在线| 成 人 免费 黄 色| 亚洲精品美女在线| 国产免费av一区| 欧美色男人天堂| 国产乱子轮xxx农村| 亚洲女与黑人做爰| 精品人妻二区中文字幕| 99精品欧美一区| 成人黄色片视频| 麻豆精品在线观看| 免费看av软件| 欧美激情五月| 玛丽玛丽电影原版免费观看1977 | 亚洲美女性生活| 亚洲黄色www| 黄色片中文字幕| 欧美美女喷水视频| 久久黄色免费视频| 一本一道综合狠狠老| 九一在线免费观看| 亚洲一区二区影院| 右手影院亚洲欧美| 国产精品久久久久久久裸模| 一级片免费在线观看视频| 成人午夜碰碰视频| 欧美两根一起进3p做受视频| 开心九九激情九九欧美日韩精美视频电影| 成年人黄色在线观看| 亚洲福利专区| 亚欧洲精品在线视频免费观看| 久久久久电影| 国严精品久久久久久亚洲影视| 国产精品日韩精品中文字幕| 成人性生交xxxxx网站| 欧美日韩一区二区三区四区不卡| 国产精品国产三级国产aⅴ浪潮 | 国产99精品视频| 无码人妻精品一区二区三区66| 国产精品亚洲一区二区三区妖精| 北条麻妃在线视频观看| 激情偷乱视频一区二区三区| 男女超爽视频免费播放| 蜜桃精品视频在线| 国产老熟妇精品观看| 久久成人免费日本黄色| 每日在线更新av| 国产成a人亚洲| 亚洲国产精品三区| 91色视频在线| 国产xxxxhd| 中文字幕精品综合| av黄色一级片| 亚洲黄一区二区三区| 老熟妇一区二区| 婷婷国产在线综合| 亚洲熟女www一区二区三区| 欧美视频在线一区| 91九色丨porny丨肉丝| 日韩欧美国产不卡| 欧美激情一区二区三区免费观看| 亚洲国产精品电影| 99re只有精品| 日韩中文字幕在线| 992tv国产精品成人影院| 51ⅴ精品国产91久久久久久| 91成人福利社区| 国产精品久久91| 久久最新网址| 久久久久久久久久久一区| 欧美日韩综合| 六月婷婷激情网| 精品一区二区三区在线观看| 十八禁视频网站在线观看| 99久久精品国产一区| 国产一级免费片| 亚洲一二三区不卡| 久久久久久久国产精品毛片| 制服丝袜国产精品| 国产精品系列视频| 操日韩av在线电影| 欧美久久亚洲| 亚洲v日韩v综合v精品v| 中文字幕一区二区三区久久网站| 中文字幕欧美日韩一区二区| 青青草国产精品亚洲专区无| 免费看a级黄色片| 欧美激情一区二区三区| 日本xxxxxxxxx18| 在线一区二区三区| 天天综合久久综合| 色偷偷噜噜噜亚洲男人的天堂| 日韩五码电影| 91亚洲va在线va天堂va国| 欧美在线91| 真实国产乱子伦对白视频| 国产成人aaa| 中文视频在线观看| 黄色成人在线播放| 在线观看日韩中文字幕| 亚洲女人初尝黑人巨大| 日韩一区二区三区免费| 国产日韩在线精品av| 久久久国产精品| 国产一级做a爰片久久毛片男| 成人午夜视频免费看| 国产麻豆xxxvideo实拍| 日韩欧美aⅴ综合网站发布| 无码人妻一区二区三区免费| 日韩在线视频中文字幕| 久久精品九色| 国产精品乱子乱xxxx| 国产精品久久777777毛茸茸| 日韩精品一区二区三区不卡| 国产精品你懂的| 久久久久久久久久久久久女过产乱| 日韩欧美一级二级三级| 超级碰碰久久| 国产在线拍揄自揄视频不卡99| 欧美激情视频一区二区三区在线播放| 久久久亚洲国产精品| 久久久综合视频| 亚洲欧美精品久久| 精品国产凹凸成av人网站| 欧美极度另类| 95av在线视频| 久久精品电影| 亚洲一级片免费观看| 欧美日韩免费观看中文| 中文字幕精品一区二| 欧美精品videofree1080p| 国产一区二区三区四区二区| 一区二区三区四区在线视频| 成人爽a毛片一区二区免费| 干b视频在线观看| 日韩精品一区二区在线| se01亚洲视频| 91久久精品国产91久久性色tv | 大地资源二中文在线影视观看| 欧美精品久久一区| 成人欧美大片| 亚洲一区二区三区四区在线播放 |