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

JavaScript內(nèi)存泄露的4種方式及如何避免

開發(fā) 前端
本文將探索常見的客戶端 JavaScript 內(nèi)存泄露,以及如何使用 Chrome 開發(fā)工具發(fā)現(xiàn)問題。

簡介

內(nèi)存泄露是每個(gè)開發(fā)者最終都要面對(duì)的問題,它是許多問題的根源:反應(yīng)遲緩,崩潰,高延遲,以及其他應(yīng)用問題。

什么是內(nèi)存泄露?

本質(zhì)上,內(nèi)存泄露可以定義為:應(yīng)用程序不再需要占用內(nèi)存的時(shí)候,由于某些原因,內(nèi)存沒有被操作系統(tǒng)或可用內(nèi)存池回收。編程語言管理內(nèi)存的方式各不相 同。只有開發(fā)者最清楚哪些內(nèi)存不需要了,操作系統(tǒng)可以回收。一些編程語言提供了語言特性,可以幫助開發(fā)者做此類事情。另一些則寄希望于開發(fā)者對(duì)內(nèi)存是否需 要清晰明了。

JavaScript 內(nèi)存管理

JavaScript 是一種垃圾回收語言。垃圾回收語言通過周期性地檢查先前分配的內(nèi)存是否可達(dá),幫助開發(fā)者管理內(nèi)存。換言之,垃圾回收語言減輕了“內(nèi)存仍可用”及“內(nèi)存仍可 達(dá)”的問題。兩者的區(qū)別是微妙而重要的:僅有開發(fā)者了解哪些內(nèi)存在將來仍會(huì)使用,而不可達(dá)內(nèi)存通過算法確定和標(biāo)記,適時(shí)被操作系統(tǒng)回收。

JavaScript 內(nèi)存泄露

垃圾回收語言的內(nèi)存泄露主因是不需要的引用。理解它之前,還需了解垃圾回收語言如何辨別內(nèi)存的可達(dá)與不可達(dá)。

Mark-and-sweep

大部分垃圾回收語言用的算法稱之為 Mark-and-sweep 。算法由以下幾步組成:

  1. 垃圾回收器創(chuàng)建了一個(gè)“roots”列表。Roots 通常是代碼中全局變量的引用。JavaScript 中,“window” 對(duì)象是一個(gè)全局變量,被當(dāng)作 root 。window 對(duì)象總是存在,因此垃圾回收器可以檢查它和它的所有子對(duì)象是否存在(即不是垃圾);

  2. 所有的 roots 被檢查和標(biāo)記為激活(即不是垃圾)。所有的子對(duì)象也被遞歸地檢查。從 root 開始的所有對(duì)象如果是可達(dá)的,它就不被當(dāng)作垃圾。

  3. 所有未被標(biāo)記的內(nèi)存會(huì)被當(dāng)做垃圾,收集器現(xiàn)在可以釋放內(nèi)存,歸還給操作系統(tǒng)了。

現(xiàn)代的垃圾回收器改良了算法,但是本質(zhì)是相同的:可達(dá)內(nèi)存被標(biāo)記,其余的被當(dāng)作垃圾回收。

不需要的引用是指開發(fā)者明知內(nèi)存引用不再需要,卻由于某些原因,它仍被留在激活的 root 樹中。在 JavaScript 中,不需要的引用是保留在代碼中的變量,它不再需要,卻指向一塊本該被釋放的內(nèi)存。有些人認(rèn)為這是開發(fā)者的錯(cuò)誤。

為了理解 JavaScript 中最常見的內(nèi)存泄露,我們需要了解哪種方式的引用容易被遺忘。

三種類型的常見 JavaScript 內(nèi)存泄露

1:意外的全局變量

JavaScript 處理未定義變量的方式比較寬松:未定義的變量會(huì)在全局對(duì)象創(chuàng)建一個(gè)新變量。在瀏覽器中,全局對(duì)象是 window 。

  1. function foo(arg) { 
  2.     bar = "this is a hidden global variable"

真相是:

  1. function foo(arg) { 
  2.     window.bar = "this is an explicit global variable"

函數(shù) foo 內(nèi)部忘記使用 var ,意外創(chuàng)建了一個(gè)全局變量。此例泄露了一個(gè)簡單的字符串,無傷大雅,但是有更糟的情況。

另一種意外的全局變量可能由 this 創(chuàng)建:

 

  1. function foo() { 
  2.     this.variable = "potential accidental global"
  3.  
  4. // Foo 調(diào)用自己,this 指向了全局對(duì)象(window) 
  5. // 而不是 undefined 
  6. foo(); 

在 JavaScript 文件頭部加上 'use strict',可以避免此類錯(cuò)誤發(fā)生。啟用嚴(yán)格模式解析 JavaScript ,避免意外的全局變量。

全局變量注意事項(xiàng)

盡管我們討論了一些意外的全局變量,但是仍有一些明確的全局變量產(chǎn)生的垃圾。它們被定義為不可回收(除非定義為空或重新分配)。尤其當(dāng)全局變量用于 臨時(shí)存儲(chǔ)和處理大量信息時(shí),需要多加小心。如果必須使用全局變量存儲(chǔ)大量數(shù)據(jù)時(shí),確保用完以后把它設(shè)置為 null 或者重新定義。與全局變量相關(guān)的增加內(nèi)存消耗的一個(gè)主因是緩存。緩存數(shù)據(jù)是為了重用,緩存必須有一個(gè)大小上限才有用。高內(nèi)存消耗導(dǎo)致緩存突破上限,因?yàn)榫?存內(nèi)容無法被回收。

2:被遺忘的計(jì)時(shí)器或回調(diào)函數(shù)

在 JavaScript 中使用 setInterval 非常平常。一段常見的代碼:

  1. var someResource = getData(); 
  2. setInterval(function() { 
  3.     var node = document.getElementById('Node'); 
  4.     if(node) { 
  5.         // 處理 node 和 someResource 
  6.         node.innerHTML = JSON.stringify(someResource)); 
  7.     } 
  8. }, 1000); 

此例說明了什么:與節(jié)點(diǎn)或數(shù)據(jù)關(guān)聯(lián)的計(jì)時(shí)器不再需要,node 對(duì)象可以刪除,整個(gè)回調(diào)函數(shù)也不需要了。可是,計(jì)時(shí)器回調(diào)函數(shù)仍然沒被回收(計(jì)時(shí)器停止才會(huì)被回收)。同時(shí),someResource 如果存儲(chǔ)了大量的數(shù)據(jù),也是無法被回收的。

對(duì)于觀察者的例子,一旦它們不再需要(或者關(guān)聯(lián)的對(duì)象變成不可達(dá)),明確地移除它們非常重要。老的 IE 6 是無法處理循環(huán)引用的。如今,即使沒有明確移除它們,一旦觀察者對(duì)象變成不可達(dá),大部分瀏覽器是可以回收觀察者處理函數(shù)的。

觀察者代碼示例:

 

  1. var element = document.getElementById('button'); 
  2. function onClick(event) { 
  3.     element.innerHTML = 'text'
  4.  
  5. element.addEventListener('click', onClick); 

對(duì)象觀察者和循環(huán)引用注意事項(xiàng)

老版本的 IE 是無法檢測(cè) DOM 節(jié)點(diǎn)與 JavaScript 代碼之間的循環(huán)引用,會(huì)導(dǎo)致內(nèi)存泄露。如今,現(xiàn)代的瀏覽器(包括 IE 和 Microsoft Edge)使用了更先進(jìn)的垃圾回收算法,已經(jīng)可以正確檢測(cè)和處理循環(huán)引用了。換言之,回收節(jié)點(diǎn)內(nèi)存時(shí),不必非要調(diào)用 removeEventListener 了。

3:脫離 DOM 的引用

有時(shí),保存 DOM 節(jié)點(diǎn)內(nèi)部數(shù)據(jù)結(jié)構(gòu)很有用。假如你想快速更新表格的幾行內(nèi)容,把每一行 DOM 存成字典(JSON 鍵值對(duì))或者數(shù)組很有意義。此時(shí),同樣的 DOM 元素存在兩個(gè)引用:一個(gè)在 DOM 樹中,另一個(gè)在字典中。將來你決定刪除這些行時(shí),需要把兩個(gè)引用都清除。

  1. var elements = { 
  2.     button: document.getElementById('button'), 
  3.     image: document.getElementById('image'), 
  4.     text: document.getElementById('text'
  5. }; 
  6.  
  7. function doStuff() { 
  8.     image.src = 'http://some.url/image'
  9.     button.click(); 
  10.     console.log(text.innerHTML); 
  11.     // 更多邏輯 
  12.  
  13. function removeButton() { 
  14.     // 按鈕是 body 的后代元素 
  15.     document.body.removeChild(document.getElementById('button')); 
  16.  
  17.     // 此時(shí),仍舊存在一個(gè)全局的 #button 的引用 
  18.     // elements 字典。button 元素仍舊在內(nèi)存中,不能被 GC 回收。 

此外還要考慮 DOM 樹內(nèi)部或子節(jié)點(diǎn)的引用問題。假如你的 JavaScript 代碼中保存了表格某一個(gè) <td> 的引用。將來決定刪除整個(gè)表格的時(shí)候,直覺認(rèn)為 GC 會(huì)回收除了已保存的 <td> 以外的其它節(jié)點(diǎn)。實(shí)際情況并非如此:此<td> 是表格的子節(jié)點(diǎn),子元素與父元素是引用關(guān)系。由于代碼保留了 <td> 的引用,導(dǎo)致整個(gè)表格仍待在內(nèi)存中。保存 DOM 元素引用的時(shí)候,要小心謹(jǐn)慎。

4:閉包

閉包是 JavaScript 開發(fā)的一個(gè)關(guān)鍵方面:匿名函數(shù)可以訪問父級(jí)作用域的變量。

代碼示例:

 

  1. var theThing = null
  2. var replaceThing = function () { 
  3.   var originalThing = theThing; 
  4.   var unused = function () { 
  5.     if (originalThing) 
  6.       console.log("hi"); 
  7.   }; 
  8.  
  9.   theThing = { 
  10.     longStr: new Array(1000000).join('*'), 
  11.     someMethod: function () { 
  12.       console.log(someMessage); 
  13.     } 
  14.   }; 
  15. }; 
  16.  
  17. setInterval(replaceThing, 1000); 

代碼片段做了一件事情:每次調(diào)用 replaceThing ,theThing 得到一個(gè)包含一個(gè)大數(shù)組和一個(gè)新閉包(someMethod)的新對(duì)象。同時(shí),變量 unused 是一個(gè)引用 originalThing 的閉包(先前的 replaceThing 又調(diào)用了 theThing )。思緒混亂了嗎?最重要的事情是,閉包的作用域一旦創(chuàng)建,它們有同樣的父級(jí)作用域,作用域是共享的。someMethod 可以通過 theThing 使用,someMethod 與 unused 分享閉包作用域,盡管 unused從未使用,它引用的 originalThing 迫使它保留在內(nèi)存中(防止被回收)。當(dāng)這段代碼反復(fù)運(yùn)行,就會(huì)看到內(nèi)存占用不斷上升,垃圾回收器(GC)并無法降低內(nèi)存占用。本質(zhì)上,閉包的鏈表已經(jīng)創(chuàng)建,每一個(gè)閉包作用域攜帶一個(gè)指向大數(shù)組的間接的引用,造成嚴(yán)重的內(nèi)存泄露。

Meteor 的博文 解釋了如何修復(fù)此種問題。在 replaceThing 的***添加 originalThing = null 。

Chrome 內(nèi)存剖析工具概覽

Chrome 提供了一套很棒的檢測(cè) JavaScript 內(nèi)存占用的工具。與內(nèi)存相關(guān)的兩個(gè)重要的工具:timeline 和 profiles

Timeline

附圖1

timeline 可以檢測(cè)代碼中不需要的內(nèi)存。在此截圖中,我們可以看到潛在的泄露對(duì)象穩(wěn)定的增長,數(shù)據(jù)采集快結(jié)束時(shí),內(nèi)存占用明顯高于采集初期,Node(節(jié)點(diǎn))的總量也很高。種種跡象表明,代碼中存在 DOM 節(jié)點(diǎn)泄露的情況。

Profiles

附圖2

Profiles 是你可以花費(fèi)大量時(shí)間關(guān)注的工具,它可以保存快照,對(duì)比 JavaScript 代碼內(nèi)存使用的不同快照,也可以記錄時(shí)間分配。每一次結(jié)果包含不同類型的列表,與內(nèi)存泄露相關(guān)的有 summary(概要) 列表和 comparison(對(duì)照) 列表。

summary(概要) 列表展示了不同類型對(duì)象的分配及合計(jì)大小:shallow size(特定類型的所有對(duì)象的總大小),retained size(shallow size 加上其它與此關(guān)聯(lián)的對(duì)象大小)。它還提供了一個(gè)概念,一個(gè)對(duì)象與關(guān)聯(lián)的 GC root 的距離。

對(duì)比不同的快照的 comparison list 可以發(fā)現(xiàn)內(nèi)存泄露。

實(shí)例:使用 Chrome 發(fā)現(xiàn)內(nèi)存泄露

實(shí)質(zhì)上有兩種類型的泄露:周期性的內(nèi)存增長導(dǎo)致的泄露,以及偶現(xiàn)的內(nèi)存泄露。顯而易見,周期性的內(nèi)存泄露很容易發(fā)現(xiàn);偶現(xiàn)的泄露比較棘手,一般容易被忽視,偶爾發(fā)生一次可能被認(rèn)為是優(yōu)化問題,周期性發(fā)生的則被認(rèn)為是必須解決的 bug。

以 Chrome 文檔中的代碼為例:

  1. var x = []; 
  2.  
  3. function createSomeNodes() { 
  4.     var div, 
  5.         i = 100
  6.         frag = document.createDocumentFragment(); 
  7.  
  8.     for (;i > 0; i--) { 
  9.         div = document.createElement("div"); 
  10.         div.appendChild(document.createTextNode(i + " - "new Date().toTimeString())); 
  11.         frag.appendChild(div); 
  12.     } 
  13.  
  14.     document.getElementById("nodes").appendChild(frag); 
  15.  
  16. function grow() { 
  17.     x.push(new Array(1000000).join('x')); 
  18.     createSomeNodes(); 
  19.     setTimeout(grow,1000); 

當(dāng) grow 執(zhí)行的時(shí)候,開始創(chuàng)建 div 節(jié)點(diǎn)并插入到 DOM 中,并且給全局變量分配一個(gè)巨大的數(shù)組。通過以上提到的工具可以檢測(cè)到內(nèi)存穩(wěn)定上升。

找出周期性增長的內(nèi)存

timeline 標(biāo)簽擅長做這些。在 Chrome 中打開例子,打開 Dev Tools ,切換到 timeline,勾選 memory 并點(diǎn)擊記錄按鈕,然后點(diǎn)擊頁面上的 The Button 按鈕。過一陣停止記錄看結(jié)果:

附圖3

兩種跡象顯示出現(xiàn)了內(nèi)存泄露,圖中的 Nodes(綠線)和 JS heap(藍(lán)線)。Nodes 穩(wěn)定增長,并未下降,這是個(gè)顯著的信號(hào)。

JS heap 的內(nèi)存占用也是穩(wěn)定增長。由于垃圾收集器的影響,并不那么容易發(fā)現(xiàn)。圖中顯示內(nèi)存占用忽漲忽跌,實(shí)際上每一次下跌之后,JS heap 的大小都比原先大了。換言之,盡管垃圾收集器不斷的收集內(nèi)存,內(nèi)存還是周期性的泄露了。

確定存在內(nèi)存泄露之后,我們找找根源所在。

保存兩個(gè)快照

切換到 Chrome Dev Tools 的 profiles 標(biāo)簽,刷新頁面,等頁面刷新完成之后,點(diǎn)擊 Take Heap Snapshot 保存快照作為基準(zhǔn)。而后再次點(diǎn)擊 The Button 按鈕,等數(shù)秒以后,保存第二個(gè)快照。

附圖4

篩選菜單選擇 Summary,右側(cè)選擇 Objects allocated between Snapshot 1 and Snapshot 2,或者篩選菜單選擇 Comparison ,然后可以看到一個(gè)對(duì)比列表。

此例很容易找到內(nèi)存泄露,看下 (string) 的 Size Delta Constructor,8MB,58個(gè)新對(duì)象。新對(duì)象被分配,但是沒有釋放,占用了8MB。

如果展開 (string) Constructor,會(huì)看到許多單獨(dú)的內(nèi)存分配。選擇某一個(gè)單獨(dú)的分配,下面的 retainers 會(huì)吸引我們的注意。

附圖5

我們已選擇的分配是數(shù)組的一部分,數(shù)組關(guān)聯(lián)到 window 對(duì)象的 x 變量。這里展示了從巨大對(duì)象到無法回收的 root(window)的完整路徑。我們已經(jīng)找到了潛在的泄露以及它的出處。

我們的例子還算簡單,只泄露了少量的 DOM 節(jié)點(diǎn),利用以上提到的快照很容易發(fā)現(xiàn)。對(duì)于更大型的網(wǎng)站,Chrome 還提供了 Record Heap Allocations 功能。

Record heap allocations 找內(nèi)存泄露

回到 Chrome Dev Tools 的 profiles 標(biāo)簽,點(diǎn)擊 Record Heap Allocations。工具運(yùn)行的時(shí)候,注意頂部的藍(lán)條,代表了內(nèi)存分配,每一秒有大量的內(nèi)存分配。運(yùn)行幾秒以后停止。

附圖6

上圖中可以看到工具的殺手锏:選擇某一條時(shí)間線,可以看到這個(gè)時(shí)間段的內(nèi)存分配情況。盡可能選擇接近峰值的時(shí)間線,下面的列表僅顯示了三種 constructor:其一是泄露最嚴(yán)重的(string),下一個(gè)是關(guān)聯(lián)的 DOM 分配,***一個(gè)是 Text constructor(DOM 葉子節(jié)點(diǎn)包含的文本)。

從列表中選擇一個(gè) HTMLDivElement constructor,然后選擇 Allocation stack

附圖7

現(xiàn)在知道元素被分配到哪里了吧(grow -> createSomeNodes),仔細(xì)觀察一下圖中的時(shí)間線,發(fā)現(xiàn) HTMLDivElement constructor 調(diào)用了許多次,意味著內(nèi)存一直被占用,無法被 GC 回收,我們知道了這些對(duì)象被分配的確切位置(createSomeNodes)。回到代碼本身,探討下如何修復(fù)內(nèi)存泄露吧。

另一個(gè)有用的特性

在 heap allocations 的結(jié)果區(qū)域,選擇 Allocation。

附圖8

這個(gè)視圖呈現(xiàn)了內(nèi)存分配相關(guān)的功能列表,我們立刻看到了 grow 和 createSomeNodes。當(dāng)選擇 grow 時(shí),看看相關(guān)的 object constructor,清楚地看到 (string)HTMLDivElement 和 Text 泄露了。

結(jié)合以上提到的工具,可以輕松找到內(nèi)存泄露。

責(zé)任編輯:王雪燕 來源: 涂鴉碼龍
相關(guān)推薦

2021-08-05 15:28:22

JS內(nèi)存泄漏

2022-05-26 09:51:50

JavaScrip內(nèi)存泄漏

2010-11-05 13:02:58

內(nèi)存iPhone

2017-12-11 11:00:27

內(nèi)存泄露判斷

2017-10-26 08:43:18

JavaScript內(nèi)存處理

2023-01-26 23:46:15

2014-10-15 10:01:12

2023-02-20 15:27:30

開發(fā)JavaScript內(nèi)存管理

2012-11-20 10:20:03

程序員程序注釋編程注釋

2025-01-22 07:59:59

2019-10-21 09:55:12

數(shù)據(jù)庫PostgreSQL Oracle

2021-08-09 09:54:37

內(nèi)存泄漏JS 阿里云

2020-11-08 14:43:25

Python列表去重編程

2015-12-07 09:39:27

Java內(nèi)存泄露

2021-04-22 07:41:46

JavaScript類型轉(zhuǎn)換

2023-05-22 15:35:10

JavaScriptWeb開發(fā)

2023-10-29 16:37:23

Goroutine泄露

2013-08-15 09:47:07

云遷移云技術(shù)

2020-06-23 09:48:09

Python開發(fā)內(nèi)存

2014-12-31 14:09:23

xml解析
點(diǎn)贊
收藏

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

91国产视频在线观看| 91一区二区三区在线观看| 色综合伊人色综合网| 久久无码人妻一区二区三区| 白白色在线观看| 久久综合狠狠综合| 91丨九色丨国产在线| 国产成人在线播放视频| 久久国产中文字幕| 亚洲电影av在线| 最新天堂中文在线| av在线最新| 最新热久久免费视频| 欧美日韩国产免费一区二区三区| 国产免费的av| 视频一区中文字幕国产| 久久99青青精品免费观看| 精品久久久久久中文字幕人妻最新| 开心久久婷婷综合中文字幕| 舔着乳尖日韩一区| 欧美一级特黄aaaaaa在线看片| 日色在线视频| 成人网在线免费视频| 国产美女精品视频| 免费看毛片网站| 99精品免费网| 久久久久久久成人| 99久久99久久精品国产| 欧美一区二区三区激情视频| 亚洲精品国产综合久久| 老女人性生活视频| 热久久久久久| 欧美日韩国产免费一区二区| 中国丰满人妻videoshd| 3344国产永久在线观看视频| 亚洲日本在线a| 日本高清不卡一区二区三| 好吊色视频一区二区| 精品一区二区三区在线播放视频| 国产不卡av在线| 一级一片免费看| 亚洲欧美网站| 欧美在线视频观看免费网站| 国产午夜福利一区二区| 亚洲视频碰碰| 久久免费国产视频| 久久免费视频播放| 激情91久久| 欧美激情图片区| 久久久久久久久99| 樱桃成人精品视频在线播放| 久久理论片午夜琪琪电影网| 国产精品成人免费观看| 欧美精品大片| 欧美激情精品久久久| 国产在线视频在线观看| 激情av一区| 97精品在线观看| 国产成人免费看| 久久蜜桃精品| 国产精品久久久一区| 国产美女激情视频| 日本成人在线一区| 成人黄色片在线| www.国产三级| 99热精品国产| 日韩三级电影| 快射视频在线观看| 亚洲精品ww久久久久久p站 | 欧美日中文字幕| 尤物99国产成人精品视频 | 一区二区欧美精品| 水蜜桃色314在线观看| 五月天av在线| 欧美日韩国产一区二区三区地区| 在线免费观看av网| 91蝌蚪精品视频| 精品小视频在线| 国产精品夜夜夜爽阿娇| 欧美激情亚洲| 国产999在线| 国产人妖一区二区| 99精品欧美一区二区三区小说| 欧美一二三区| 国产黄a三级三级三级av在线看| 亚洲午夜在线电影| 能在线观看的av| 国产999精品在线观看| 亚洲精品电影久久久| a资源在线观看| 黄色精品免费| 国产一区二区色| 亚洲av成人无码久久精品老人 | 国产亚洲欧洲在线| 男女羞羞免费视频| 久久久久久久尹人综合网亚洲| 国产精品日日做人人爱 | 亚洲精品网站在线播放gif| 纪美影视在线观看电视版使用方法| 综合久久亚洲| 国产精品99导航| 性生活视频软件| 亚洲国产精品v| 人人干视频在线| 日韩大陆av| 国产视频欧美视频| 精品欧美一区二区久久久久| 日本欧美加勒比视频| 国产伦理一区二区三区| 久做在线视频免费观看| 欧美视频裸体精品| 久久久久国产免费| 色天天综合网| 国产a级全部精品| 蜜桃av中文字幕| 亚洲欧洲综合另类在线| 国产成人精品视频ⅴa片软件竹菊| 日韩在线视频一区二区三区 | 就去色蜜桃综合| 亚洲男同gay网站| 欧美日韩成人一区| 成人性生交大片免费看无遮挡aⅴ| 亚洲国产激情| 99久久精品无码一区二区毛片| 成人三级黄色免费网站| 一本色道久久综合亚洲91| 插我舔内射18免费视频| 欧美精品一卡| 1卡2卡3卡精品视频| 尤物网在线观看| 日本久久电影网| 在线免费观看日韩av| 亚洲啪啪91| 国产欧美在线一区二区| 国产盗摄一区二区| 亚洲变态欧美另类捆绑| 久草视频在线资源站| 国产伦精品一区二区三区视频青涩| 亚洲天堂电影网| 成人亚洲网站| 日韩在线资源网| 97超碰人人模人人人爽人人爱| 国产精品久久久久四虎| 一区二区三区韩国| heyzo久久| 国产伦精品免费视频| 最近高清中文在线字幕在线观看| 在线精品国精品国产尤物884a| 欧美老熟妇乱大交xxxxx| 久久久久综合| 亚洲mv在线看| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 中文字字幕在线中文乱码| 欧美国产激情一区二区三区蜜月| 亚洲 欧美 日韩系列| 日韩精品久久| 91国产丝袜在线放| 成年人国产在线观看| 亚洲国产精品国自产拍av秋霞| 日韩欧美视频在线免费观看| xfplay精品久久| 成人午夜激情av| 欧美成人自拍| 1卡2卡3卡精品视频| 国产在线精彩视频| 亚洲性视频网站| 国产精品欧美久久久久天天影视| 一区二区三区在线视频播放| 亚洲日本久久久| 日韩中文字幕亚洲一区二区va在线| 日韩视频在线播放| 欧美另类中文字幕| 91精品国产高清久久久久久久久 | 美女av一区二区三区| 亚洲AV无码精品色毛片浪潮| 午夜视频一区在线观看| 在线免费观看视频| 国产乱子伦一区二区三区国色天香| 妞干网在线观看视频| 国产探花一区二区| 91久色国产| 在线成人av观看| 久久久国产成人精品| 手机看片1024日韩| 欧美日韩黄色一区二区| 国产午夜视频在线| 欧美激情综合在线| 国产午夜在线一区二区三区| 肉肉av福利一精品导航| 日本免费a视频| 凹凸成人精品亚洲精品密奴| 痴汉一区二区三区| 精品久久在线| 91av在线看| 秋霞在线视频| 色吧影院999| 日本精品专区| 精品国产一区二区三区久久久蜜月 | 国产乱淫av片| 石原莉奈在线亚洲二区| 免费在线黄网站| 日韩国产专区| 麻豆传媒一区| 成人av婷婷| 91免费观看网站| av在线一区不卡| 97超碰色婷婷| 国精一区二区三区| 久久成人在线视频| jyzzz在线观看视频| 亚洲精品国产欧美| 黄色www视频| 欧美一区二区私人影院日本| 凹凸精品一区二区三区| 精品欧美一区二区三区| 欧美激情一区二区视频| 国产精品美日韩| 欧美成人国产精品一区二区| a美女胸又www黄视频久久| 在线成人精品视频| 狠狠色丁香久久婷婷综| 香港日本韩国三级网站| 丝袜亚洲另类丝袜在线| 色欲av无码一区二区人妻| 日韩一级不卡| 妞干网在线视频观看| 亚洲黄色成人| 久久成人福利视频| 伊人精品成人久久综合软件| 欧美一区二区视频在线播放| 欧美一区影院| 国产又粗又长又爽视频| 91久久国产| 青少年xxxxx性开放hg| 亚洲国产日韩欧美在线| 伊人狠狠色丁香综合尤物| 日韩精品影视| 亚洲一区二区三区色| 日韩成人综合| 在线观看福利一区| 天天超碰亚洲| 日本免费在线视频观看| 亚洲国产精品日韩专区av有中文| 一区二区三区一级片| 91精品二区| wwwwww欧美| 亚洲国产专区校园欧美| 国产深夜男女无套内射| 亚洲欧美视频一区二区三区| 日本999视频| 毛片基地黄久久久久久天堂| 思思久久精品视频| 国产精品一区二区果冻传媒| 成人欧美精品一区二区| av爱爱亚洲一区| 五月婷婷综合在线观看| 欧美国产在线观看| 三级全黄做爰视频| 一级精品视频在线观看宜春院| 国产在线视频卡一卡二| 一本一道波多野结衣一区二区 | 欧美v亚洲v综合ⅴ国产v| 成人毛片视频免费看| 日韩精品中文字幕在线| 国产高清在线| 超碰91人人草人人干| 国产www视频在线观看| 青草成人免费视频| 久久91视频| 国产精选在线观看91| 欧美理论在线播放| 好色先生视频污| 国产日韩欧美一区在线| 免费一级特黄录像| 国产成人无遮挡在线视频| 久久精品综合视频| 国产精品久久看| 国产午夜免费视频| 欧美在线啊v一区| 精品人妻无码一区二区三区蜜桃一| 亚洲国产第一页| av电影在线网| 高清在线视频日韩欧美| 久久久成人av毛片免费观看| 亚洲综合日韩在线| 香蕉久久精品| 三上悠亚免费在线观看| 午夜亚洲一区| 中国特级黄色片| 中文久久乱码一区二区| 日韩精品一区二区三区国语自制| 欧美日韩中文国产| 日批视频在线播放| 中文字幕久热精品在线视频| 国产又色又爽又黄刺激在线视频| 国产精品va在线播放| 久久97精品| 99re6这里有精品热视频| 日韩一区欧美二区| 亚洲av成人片无码| 国产精品久久福利| 欧美 日韩 精品| 精品乱人伦小说| 麻豆最新免费在线视频| 欧美一级大片在线免费观看| 久久久国产精品入口麻豆| 日韩av不卡在线播放| 亚洲国产一区二区精品专区| 黄色片子免费看| 一色屋精品亚洲香蕉网站| 精品久久久久久久久久久久久久久久| 欧美一二三四在线| 日本韩国在线视频爽| 国产精品国产三级国产aⅴ浪潮| 国产亚洲精品美女久久| 亚洲黄色网址在线观看| 免费观看在线色综合| 无码h肉动漫在线观看| 亚欧色一区w666天堂| 国产福利资源在线| xvideos亚洲| 欧美xxxx性| 亚洲狠狠婷婷综合久久久| 欧美专区18| 亚洲国产精品成人综合久久久| 亚洲一区二区三区美女| 国产极品久久久| 欧美俄罗斯乱妇| av一级亚洲| 亚洲 欧美 日韩 国产综合 在线| 国产91精品入口| 久久视频免费看| 欧美xxxxxxxx| xxxx视频在线| 精品综合久久| 中文精品视频| 中文字幕在线看高清电影| 欧美色视频日本版| 九一在线视频| 国产精品video| 欧美日韩一区二区综合| 日日躁夜夜躁aaaabbbb| 国产精品福利一区| 一本到在线视频| 久久精品青青大伊人av| 久久精品九色| 99久久国产综合精品五月天喷水| 国产91精品精华液一区二区三区| 久久久久成人精品无码| 精品久久久久av影院| 99re6在线精品视频免费播放| 狠狠色伊人亚洲综合网站色| 亚洲中字在线| 手机看片国产日韩| 欧美区在线观看| 欧洲性视频在线播放| 国产一区二区免费电影| 亚洲综合国产激情另类一区| 妺妺窝人体色WWW精品| 欧美人牲a欧美精品| 美女91在线| 欧美日韩精品不卡| 麻豆精品视频在线观看免费| 欧美一区免费观看| 精品成人在线观看| 中文字幕人成乱码在线观看| 天堂社区 天堂综合网 天堂资源最新版 | 玉米视频成人免费看| 特黄aaaaaaaaa真人毛片| 欧美亚洲第一区| 日韩国产欧美| 成人一区二区三区仙踪林| 狠狠躁夜夜躁人人躁婷婷91 | 欧美精品video| 蜜桃一区二区| 日本黄色的视频| 亚洲国产成人高清精品| 九一国产在线| 91在线播放视频| 久久激情网站| 强制高潮抽搐sm调教高h| 亚洲国产精品久久| 久久婷婷五月综合色丁香| 97视频在线免费| 国产精品麻豆网站| 日本激情一区二区三区| 国产综合香蕉五月婷在线| 亚洲日韩视频| 国产精品久久国产精麻豆96堂| 亚洲国产精品热久久| 欧美日韩视频免费观看| 国产一级大片免费看| 国产欧美一区在线| 丰满人妻妇伦又伦精品国产| 国产精品美女视频网站| 精品69视频一区二区三区Q| 91大神福利视频| 亚洲人成电影在线播放| 中文字幕av一区二区三区四区| 亚洲一区二区三区四区五区xx|