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

JavaScript 內(nèi)存泄漏防范之道

開發(fā) 前端
一般情況下,忽視內(nèi)存管理不會對傳統(tǒng)的網(wǎng)頁產(chǎn)生顯著的后果。這是因為,用戶刷新頁面后,內(nèi)存數(shù)據(jù)都被清理了。

 一般情況下,忽視內(nèi)存管理不會對傳統(tǒng)的網(wǎng)頁產(chǎn)生顯著的后果。這是因為,用戶刷新頁面后,內(nèi)存數(shù)據(jù)都被清理了。

[[329247]]

但是隨著SPA(單頁應用)的普及,我們不得不更加關注頁面的內(nèi)存管理。用戶在 SPA 上往往很少刷新頁面,隨著頁面停留時間的增長,內(nèi)存可能越占越多,輕則影響頁面性能,嚴重的可能導致標簽頁崩潰。

在這篇文章中,我們將探討導致 JavaScript 中內(nèi)存泄露的常見原因,以及如何改善內(nèi)存管理。

瀏覽器將對象保留在堆內(nèi)存中,通過引用鏈可從根對象到達這些對象。垃圾回收器(GC)是 JavaScript 引擎中的一個后臺進程,它可以識別無法到達的對象,將其刪除,并回收相應的內(nèi)存。

 

引用鏈 - GC - 對象關系圖

當內(nèi)存中本應在垃圾回收循環(huán)中被清理的對象,通過另一個對象意外的引用從而維持可訪問狀態(tài),就會發(fā)生內(nèi)存泄漏。將多余的對象保持在內(nèi)存中,會導致應用程序內(nèi)部的內(nèi)存使用量過大,進而影響性能。

 

內(nèi)存泄露

如何判斷代碼是否存在內(nèi)存泄漏呢?內(nèi)存泄漏通常比較隱蔽,難以發(fā)現(xiàn)和定位。造成內(nèi)存泄漏的 JavaScript 代碼看上去挺正常,瀏覽器在運行的時候也不會拋出錯誤。如果發(fā)現(xiàn)頁面性能越來越差,通常是內(nèi)存泄漏的征兆,可以通過瀏覽器內(nèi)置的工具判斷是否存在內(nèi)存泄漏,并分析出原因。

最快的方法是查看瀏覽器的任務管理器(注意,不是操作系統(tǒng)的任務管理器)。它提供了瀏覽器運行中的所有 tab 頁和進程的資源使用情況,比如內(nèi)存占用、CPU 占用和進程 ID 等。Chrome 的任務管理器可通過 Shift+Esc 快捷鍵打開,F(xiàn)irefox 可在地址欄輸入about:performance打開。

如果頁面都沒有任何交互,內(nèi)存占用卻越來越多,很可能存在泄漏。

  

Chrome 任務管理器

瀏覽器 DevTools 則提供了更豐富的內(nèi)存管理功能??梢栽?Chrome 的性能面板錄制頁面運行情況,查看可視化的性能分析數(shù)據(jù)。

 

Chrome 性能面板

除此之外,Chrome 和 Firefox 的 DevTools 還有專門的內(nèi)存工具用于分析內(nèi)存使用情況。通過比較連續(xù)的內(nèi)存快照,可以看出內(nèi)存分配情況。

通過前面的分析,內(nèi)存泄露的根本原因就是代碼在無意之中引用了本該被 GC 回收的對象。那么,哪些情況容易造成內(nèi)存泄露呢?

1、意外的全局變量

全局變量一直處于可訪問狀態(tài),不會被 GC 回收。在非嚴格模式下,有時會不小心讓局部變量變成全局變量。

  • 給未聲明的變量賦值
  • 使用指向全局對象的 this
  1. function createGlobalVariables() { 
  2.     leaking1 = '變成全局變量了'; // 給未聲明的變量賦值 
  3.     this.leaking2 = '這也是全局變量'; // 'this' 指向全局對象 
  4. }; 
  5. createGlobalVariables(); 
  6. window.leaking1; // '變成全局變量了' 
  7. window.leaking2; // '這也是全局變量' 

如何避免: 嚴格模式 ("use strict") 會避免意外的全局變量,以上代碼在嚴格模式下會報錯。

2、閉包

函數(shù)作用域變量在函數(shù)執(zhí)行完后會被清理,前提是在函數(shù)外部沒有引用它。閉包會讓變量一直處于被引用狀態(tài),即使它的執(zhí)行上下文和作用域已經(jīng)不存在了。

  1. function outer() { 
  2.     const Array = []; 
  3.     return function inner() { 
  4.         bigArray.push('Hello');  
  5.         console.log('Hello'); 
  6.     }; 
  7. }; 
  8. const sayHello = outer(); // 包含了對 inner 的引用 
  9.  
  10. function repeat(fn, num) { 
  11.     for (let i = 0; i < num; i++){ 
  12.         fn(); 
  13.     } 
  14. repeat(sayHello, 10); // 每次調(diào)用 sayHello 都會添加 'Hello' 到potentiallyHugeArray  
  15.  
  16. // 如果是10萬次呢?闊怕:repeat(sayHello, 100000) 

上面例子中的數(shù)組 bigArray 沒有從任何函數(shù)中直接返回,因此無法直接訪問,但是它卻不停地膨脹,取決于我們調(diào)用了多少次 function inner()。

如何避免: 閉包是 JavaScript 語言的特性之一,如果無法避開,那就請注意兩點:

  • 清楚閉包是何時創(chuàng)建的,以及哪些對象會被保留在內(nèi)存中;
  • 清楚閉包的生命周期和用途(尤其是當做回調(diào)函數(shù)的時候)

3、定時器

在 setTimeout 或 setInterval 的回調(diào)函數(shù)中引用某些對象,是防止被 GC 回收的常見做法。如果在代碼里設置循環(huán)定時器(setTimeout也能像setInterval一樣定時重復執(zhí)行,只要設置成遞歸調(diào)用),只要定時器還在運行,回調(diào)函數(shù)中的對象就會一直保持在內(nèi)存中。

下面的例子中,data 對象會在清除定時器后被 GC 回收。但我們沒有獲取 setInterval的返回值,也就沒辦法用代碼清除這個定時器,因此盡管完全沒有用到,data.hugeString 也會一直保留在內(nèi)存中,直到進程結(jié)束。

  1. function setCallback() { 
  2.     const data = { 
  3.         counter: 0, 
  4.         hugeString: new Array(100000).join('x'
  5.     }; 
  6.     return function cb() { 
  7.         data.counter++; // data 對象現(xiàn)在已經(jīng)屬于回調(diào)函數(shù)的作用域了 
  8.         console.log(data.counter); 
  9.     } 
  10. setInterval(setCallback(), 1000); // 沒法停止定時器了 

如何避免: 對于生命周期不確定的回調(diào)函數(shù),我們應該:

  • 注意被定時器回調(diào)函數(shù)引用的對象
  • 使用定時器返回的句柄,在必要時清除它

也可以通過分離變量的方式,避免對大對象的引用:

  1. function setCallback() { 
  2.     // 分開定義變量 
  3.     let counter = 0; 
  4.     const hugeString = new Array(100000).join('x'); // setCallback執(zhí)行完即可被回收 
  5.     return function cb() { 
  6.         counter++; // 只剩 counter 位于回調(diào)函數(shù)作用域 
  7.         console.log(counter); 
  8.     } 
  9.  
  10. const timerId = setInterval(setCallback(), 1000); // 保存定時器 ID 
  11.  
  12. // 執(zhí)行某些操作 ... 
  13.  
  14. clearInterval(timerId); // 停止定時器 

4、事件監(jiān)聽器

活動的事件監(jiān)聽器會阻止作用域內(nèi)的變量被 GC 回收。事件監(jiān)聽器一直處于活動狀態(tài),直到用 removeEventListener() 顯式移除,或者關聯(lián)的 DOM 元素被移除。

對于有些事件來說,監(jiān)聽器需要一直保留,直到頁面被銷毀。比如按鈕點擊事件,我們可能需要重復使用。但是,有時候我們希望某個事件只執(zhí)行特定次數(shù)。

  1. const hugeString = new Array(100000).join('x'); 
  2. document.addEventListener('keyup'function() { // 匿名監(jiān)聽器無法移除 
  3.     doSomething(hugeString); // hugeString 會一直處于回調(diào)函數(shù)的作用域內(nèi) 
  4. }); 

上面例子中的事件監(jiān)聽器用了匿名函數(shù),這樣就沒法用removeEventListener()移除了。同時,document元素也無法刪除,因此事件回調(diào)函數(shù)內(nèi)的變量會一直保留,哪怕我們只想觸發(fā)一次事件。

如何避免: 事件監(jiān)聽器不再需要時,要記得解除綁定。使用具名函數(shù)方式獲取引用,通過removeEventListener()解除綁定。

  1. function listener() { 
  2.     doSomething(hugeString); 
  3. document.addEventListener('keyup', listener);  
  4. document.removeEventListener('keyup', listener);  

如果事件監(jiān)聽器只需要執(zhí)行一次, addEventListener()可以接受第三個參數(shù),是一個配置對象。指定{once: true},監(jiān)聽器函數(shù)會在事件觸發(fā)一次執(zhí)行后自動移除(匿名函數(shù)也可以)。

  1. document.addEventListener('keyup'function listener(){ 
  2.     doSomething(hugeString); 
  3. }, {once: true}); // 執(zhí)行一次后自動移除事件監(jiān)聽器 

5、緩存

如果持續(xù)不斷地往緩存里增加數(shù)據(jù),沒有定時清除無用的對象,也沒有限制緩存大小,那么緩存就會像滾雪球一樣越來越大。

  1. let user_1 = { name"Kayson", id: 12345 }; 
  2. let user_2 = { name"Jerry", id: 54321 }; 
  3. const mapCache = new Map(); 
  4.  
  5. function cache(obj){ 
  6.     if (!mapCache.has(obj)){ 
  7.         const value = `${obj.name} has an id of ${obj.id}`; 
  8.         mapCache.set(obj, value); 
  9.  
  10.         return [value, 'computed']; 
  11.     } 
  12.  
  13.     return [mapCache.get(obj), 'cached']; 
  14.  
  15. cache(user_1); // ['Kayson has an id of 12345''computed'
  16. cache(user_1); // ['Kayson has an id of 12345''cached'
  17. cache(user_2); // ['Jerry has an id of 54321''computed'
  18.  
  19. console.log(mapCache); // ((…) => "Kayson has an id of 12345", (…) => "Jerry has an id of 54321"
  20. user_1 = null;  
  21.  
  22. //Garbage Collector 
  23. console.log(mapCache); // ((…) => "Kayson has an id of 12345", (…) => "Jerry has an id of 54321") // 依然在緩存里 

上面的例子中,緩存依然保留了user_1 的數(shù)據(jù)。因此我們需要把不再使用的數(shù)據(jù)從緩存中刪除。

可能的解決方案: 為了解決這個問題,可以使用 WeakMap。 WeakMap 是一種數(shù)據(jù)結(jié)構(gòu),它只用對象作為鍵,并保持對象鍵的弱引用,如果這個對象被置空了,相關的鍵值對會被 GC 自動回收。

  1. let user_1 = { name"Kayson", id: 12345 }; 
  2. let user_2 = { name"Jerry", id: 54321 }; 
  3. const weakMapCache = new WeakMap(); 
  4.  
  5. function cache(obj){ 
  6.     // 代碼跟前一個例子相同,只不過用的是 weakMapCache 
  7.  
  8.     return [weakMapCache.get(obj), 'cached']; 
  9.  
  10. cache(user_1); // ['Kayson has an id of 12345''computed'
  11. cache(user_2); // ['Jerry has an id of 54321''computed'
  12. console.log(weakMapCache); // ((…) => "Kayson has an id of 12345", (…) => "Jerry has an id of 54321"
  13. user_1 = null;  
  14.  
  15. // Garbage Collector 
  16.  
  17. console.log(weakMapCache); // ((…) => "Jerry has an id of 54321") - 第一條記錄已被 GC 刪除 

6、分離的 DOM 元素

如果 DOM 節(jié)點被 JavaScript 代碼直接引用,即使從 DOM 樹分離,也不會被 GC 回收。

下面的例子中,removeChild() 達不到預期效果,堆快照會顯示HTMLDivElement處于分離狀態(tài),因為有個變量指向了這個div。

  1. function createElement() { 
  2.     const div = document.createElement('div'); 
  3.     div.id = 'detached'
  4.     return div; 
  5.  
  6. // 即使調(diào)用了deleteElement() ,依然保存著 DOM 元素的引用 
  7. const detachedDiv = createElement(); 
  8. document.body.appendChild(detachedDiv); 
  9. function deleteElement() { 
  10. document.body.removeChild(document.getElementById('detached')); 
  11.  
  12. deleteElement(); // 堆快照顯示: detached div#detached 

如何避免: 一種方法是把DOM 引用限制為局部作用域。

  1. function createElement() {...} //  
  2. // DOM 引用位于函數(shù)作用域內(nèi) 
  3.  
  4. function appendElement() { 
  5.     const detachedDiv = createElement(); 
  6.     document.body.appendChild(detachedDiv); 
  7.  
  8. appendElement(); 
  9.  
  10. function deleteElement() { 
  11.      document.body.removeChild(document.getElementById('detached')); 
  12.  
  13. deleteElement(); 

總結(jié)

對于重要的前端應用,定位和解決 JavaScript 內(nèi)存問題是一項頗具挑戰(zhàn)性的任務。因此,理解典型的內(nèi)存泄露原因,從而在源頭上避免,是做好內(nèi)存管理的必要工作。希望本文總結(jié)的造成內(nèi)存泄漏的六大來源對你有所啟發(fā),在寫代碼的時候有所防范。

 

責任編輯:華軒 來源: 大道至簡
相關推薦

2025-05-06 07:24:24

2021-08-05 15:28:22

JS內(nèi)存泄漏

2025-08-04 01:00:00

JavaScript內(nèi)存泄漏前端

2013-01-22 11:31:00

2009-06-10 22:03:40

JavaScript內(nèi)IE內(nèi)存泄漏

2022-05-26 09:51:50

JavaScrip內(nèi)存泄漏

2010-07-16 09:11:40

JavaScript內(nèi)存泄漏

2012-04-06 10:04:21

2021-02-26 00:49:00

DMARC郵件安全信息泄漏

2022-09-28 10:35:31

JavaScript代碼內(nèi)存泄漏

2023-02-20 15:27:30

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

2024-03-11 08:22:40

Java內(nèi)存泄漏

2023-12-18 10:45:23

內(nèi)存泄漏計算機服務器

2014-07-28 15:01:56

Android內(nèi)存

2014-07-21 14:40:43

Android內(nèi)存

2012-02-22 21:28:58

內(nèi)存泄漏

2024-01-15 16:28:42

ChatGPTGenAI人工智能

2016-05-17 09:42:16

2022-08-31 12:15:09

JavaScript代碼優(yōu)化

2014-07-31 10:48:09

Android內(nèi)存管理OOM
點贊
收藏

51CTO技術棧公眾號

六月激情综合网| 久久久国产一区二区| 777久久久精品一区二区三区| 日韩欧美在线观看一区二区| 麻豆久久精品| 久久人体大胆视频| 漂亮人妻被黑人久久精品| 成人私拍视频| 一区二区三区四区不卡在线 | 看一级黄色录像| 国模无码一区二区三区| 三级精品在线观看| 久久久久久综合网天天| 欧美另类z0zx974| 一本色道69色精品综合久久| 色天天综合久久久久综合片| 日本美女爱爱视频| 成人高清免费在线播放| 国产成人精品三级麻豆| 国产91精品久久久久久久| 全网免费在线播放视频入口| 怕怕欧美视频免费大全| 精品久久久影院| www.cao超碰| 吞精囗交69激情欧美| 亚洲成人资源网| 男女激烈动态图| 成人午夜电影在线观看| 91麻豆精东视频| 国产精品一区视频| 99热这里只有精品9| 免费av网站大全久久| 欧美在线视频免费播放| 久久精品女人毛片国产| 一区二区电影在线观看| 久久精品福利视频| 黄色免费一级视频| 国产精品手机在线播放 | 波多野结衣视频一区| 国产精品日韩在线一区| 亚洲午夜18毛片在线看| 夜久久久久久| 97香蕉久久超级碰碰高清版 | 一区二区三区四区日韩| 最近2019年手机中文字幕| 久久久久久国产精品无码| 久久夜色精品国产噜噜av小说| 91精品国产综合久久福利 | 国产美女久久| 欧美视频精品在线观看| 手机看片福利日韩| 忘忧草在线www成人影院| 色综合中文综合网| 大香煮伊手机一区| 蜜臀国产一区| 在线观看三级视频欧美| 婷婷丁香激情网| 高清成人在线| 欧美日韩视频在线观看一区二区三区 | 午夜精品久久久久久久男人的天堂| 成人涩涩小片视频日本| 我不卡神马影院| 草民午夜欧美限制a级福利片| 91视频最新网址| 999国产精品永久免费视频app| 视频直播国产精品| 艳妇荡乳欲伦69影片| 午夜精品偷拍| 午夜免费日韩视频| 狠狠人妻久久久久久综合| 久久综合亚州| 国产一区二区丝袜| 99视频免费看| 成人av在线资源| 久久精品成人一区二区三区蜜臀| 头脑特工队2免费完整版在线观看| 成人免费黄色在线| 久99久视频| www在线播放| 国产精品国产自产拍高清av| 2022中文字幕| 水蜜桃在线视频| 欧美亚洲一区二区在线| 手机精品视频在线| 亚洲人视频在线| 欧美第一视频| 在线播放日韩导航| 中文字幕视频观看| 国产va免费精品观看精品视频 | 美女100%无挡| 亚洲xxx拳头交| 91精品国产91| 亚洲一区二区三区高清视频| 国产精品一卡二卡| 欧美1o一11sex性hdhd| 日本激情视频在线观看| 亚洲香肠在线观看| 男人插女人下面免费视频| 粉嫩av国产一区二区三区| 精品中文字幕久久久久久| 亚洲一二三精品| 亚洲第一在线| 国产在线视频2019最新视频| 天堂在线视频观看| 日韩一区在线看| 亚洲 高清 成人 动漫| 综合久久伊人| 亚洲午夜久久久久久久| 久热精品在线观看| 久久99国产精品成人| 精品国产aⅴ麻豆| 99热国产在线中文| 91福利在线导航| 中文字幕人妻一区| 久久精品亚洲欧美日韩精品中文字幕| 91精品国产高清久久久久久91| 国产理论片在线观看| 久久久久久影视| 日韩人妻精品一区二区三区| 欧美特大特白屁股xxxx| 亚洲国产欧美在线成人app| 男人的午夜天堂| 日韩高清欧美激情| 久久精品99久久| 1234区中文字幕在线观看| 2022成人影院| 亚洲成人免费在线| 欧美一级小视频| 欧美在线观看视频一区| 欧美壮男野外gaytube| 人成网站在线观看| 亚洲美女在线一区| 精品亚洲视频在线| 91欧美日韩| 国产精品午夜国产小视频| 欧美亚洲日本| 黑人精品xxx一区| 999精品免费视频| 一区免费视频| 成人影片在线播放| 国产丝袜精品丝袜| 日韩视频在线永久播放| 538精品在线观看| 久久99日本精品| 一级黄色免费在线观看| 欧美日韩va| 日韩在线免费高清视频| 亚洲专区第一页| 国产精品视频yy9299一区| 一区二区xxx| 日韩欧美在线中字| 国产日韩精品入口| 美女隐私在线观看| 欧美一二三四在线| 免费三片在线播放| 懂色av一区二区三区蜜臀| 美脚丝袜脚交一区二区| 欧美高清视频看片在线观看| 欧美一区二区色| 九色视频成人自拍| 欧美日韩在线三级| 精品欧美一区二区久久久久| 国产高清视频一区| 国产a级片网站| 亚洲+变态+欧美+另类+精品| 国产不卡av在线免费观看| 国产资源在线播放| 欧美日韩和欧美的一区二区| av成人免费网站| 成人午夜av影视| 无码aⅴ精品一区二区三区浪潮 | 黄色小视频在线免费看| 9人人澡人人爽人人精品| 99精品视频在线看| 99热在线成人| 一二三区精品福利视频| 日韩国产高清一区| 欧美成人免费全部网站| 另类视频在线观看| 色一情一乱一乱一区91av| 色哟哟一区二区三区| 亚洲一二三在线观看| 成人国产一区二区三区精品| 人妻精品无码一区二区三区| 久久精品播放| 国产专区一区二区| 国产成人a视频高清在线观看| 欧美乱妇40p| 色资源在线观看| 777午夜精品免费视频| 午夜偷拍福利视频| 国产婷婷一区二区| av电影中文字幕| 久久久久久久高潮| 国产精品久久久影院| 亚洲小说图片| 99国产超薄丝袜足j在线观看 | 最新版天堂资源在线| 首页综合国产亚洲丝袜| 国产精品久久成人免费观看| 美女一区二区在线观看| 国产美女高潮久久白浆| 国产亚洲成av人片在线观看 | 精品99久久久久久| 中文天堂在线播放| 天天色 色综合| 亚洲综合网在线| 久久精品综合网| 人妻激情偷乱频一区二区三区| 美女mm1313爽爽久久久蜜臀| 国产最新免费视频| 欧美精品导航| 亚洲一区二区三区涩| 日韩电影不卡一区| 91视频在线免费观看| 香蕉成人av| 性色av一区二区三区红粉影视| 日韩成人影视| 日韩极品精品视频免费观看| 国产黄色高清视频| 欧美日韩亚洲另类| 成人公开免费视频| 午夜视频在线观看一区| 放荡的美妇在线播放| 欧美激情资源网| 97人妻精品一区二区三区免 | 国产在线拍揄自揄视频不卡99| 亚洲爆乳无码一区二区三区| 欧美日韩精品欧美日韩精品一| 日韩三级小视频| 亚洲男人的天堂网| 久艹在线观看视频| 国产精品国产成人国产三级| 久久丫精品国产亚洲av不卡| 成人激情午夜影院| 欧美xxxx黑人| 国产高清无密码一区二区三区| 色噜噜狠狠一区二区三区狼国成人| 日韩成人午夜精品| www.日本xxxx| 日韩电影在线看| 三级在线免费看| 日韩不卡一区二区| 日韩一级理论片| 久久尤物视频| 搡女人真爽免费午夜网站| 日本不卡一区二区三区高清视频| 人妻无码视频一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 国产成人精品视频免费看| 久久久久国产精品一区二区| 97xxxxx| 日韩av一区二| 超碰在线播放91| 精品中文字幕一区二区小辣椒| 国产九九在线观看| 精品一区二区三区av| 永久免费黄色片| 成人永久免费视频| 99久久国产精| 久久在线观看免费| 你懂得视频在线观看| 国产精品国产精品国产专区不蜜 | 色悠悠亚洲一区二区| 久久久精品毛片| 欧美无砖专区一中文字| 亚洲在线免费观看视频| 日韩欧美综合一区| 乱精品一区字幕二区| 日韩精品一二三四区| 国产高清视频在线观看| 久久精品国产清自在天天线 | 亚洲影视在线播放| 中日韩黄色大片| 在线观看日韩电影| 99国产精品一区二区三区| 精品国产凹凸成av人导航| 香蕉人妻av久久久久天天| 伊人久久久久久久久久久| 秋霞影院午夜丰满少妇在线视频| 欧美成人自拍视频| 国产伦子伦对白在线播放观看| 国产拍揄自揄精品视频麻豆| 中文字幕 日韩 欧美| 国产精品888| 无码人妻精品一区二区三应用大全| 国产人久久人人人人爽| 成人免费视频国产免费观看| 黑人巨大精品欧美一区二区免费| 正在播放亚洲精品| 亚洲成av人片在线观看香蕉| 国产精品免费观看| 欧美丰满老妇厨房牲生活| 在线观看欧美日韩电影| 91在线视频精品| 久久av电影| 黄色一级片黄色| 麻豆精品蜜桃视频网站| av在线播放网址| 成人免费一区二区三区在线观看| 日韩熟女精品一区二区三区| 欧美三级电影精品| 水中色av综合| 九九热99久久久国产盗摄| 97久久香蕉国产线看观看| 超碰97人人人人人蜜桃| 日韩欧美不卡| 1024av视频| 国产精品一区二区久激情瑜伽| 国产一区二区三区四区五区六区| 亚洲一区二区av在线| 一区二区自拍偷拍| 亚洲乱码一区二区| 伦理在线一区| 91精品视频大全| 国产成人影院| 欧美日本视频在线观看| 高清shemale亚洲人妖| 二区三区四区视频| 91成人免费在线| 四虎影院在线播放| 久久久久久久国产| 久久久久久久久成人| 亚洲精品日韩精品| 天堂av在线一区| aa一级黄色片| 亚洲6080在线| 99精品免费观看| www.亚洲一区| 日本在线一区二区| 色之综合天天综合色天天棕色| 亚洲综合社区| 婷婷五月精品中文字幕| 亚洲一区二区五区| 国产黄色av网站| 欧美精品在线免费播放| 国产精品麻豆| dy888午夜| 国产精品一区久久久久| 国产探花在线播放| 日韩精品一区二区三区四区| 在线视频中文字幕第一页| 成人h片在线播放免费网站| 久久性感美女视频| 亚洲成人福利在线| 亚洲欧洲av一区二区三区久久| 中文字幕人妻一区二区在线视频| 国产一区二区日韩| 婷婷综合六月| 亚洲精品9999| 精品一区二区三区在线播放视频| 中文字幕91视频| 欧美一区二区三区电影| 欧美成人另类视频| 久久综合成人精品亚洲另类欧美 | 欧美性一级生活| 在线观看精品一区二区三区| 国产精品日日做人人爱| 天天做天天爱天天综合网| theporn国产精品| 一区二区三区精品在线观看| 丰满少妇一级片| 26uuu日韩精品一区二区| 伊人久久综合影院| 亚洲三级视频网站| 一区精品在线播放| 精品人妻一区二区三区浪潮在线| 欧美激情在线观看| 亚洲黄页在线观看| 欧美自拍小视频| 亚洲欧美日韩国产综合| www.爱爱.com| 91av免费观看91av精品在线| 九九亚洲视频| 国产免费中文字幕| 亚洲一区二区不卡免费| 精彩国产在线| 亚洲va国产va天堂va久久| 伊人久久大香线蕉综合热线| 少妇毛片一区二区三区| 欧美三级视频在线观看| h片在线播放| 久久久综合香蕉尹人综合网| 日本中文字幕一区| 顶臀精品视频www| 国产视频精品xxxx| 91精品一区| 能在线观看的av| 亚洲欧洲成人精品av97| 天天爽夜夜爽夜夜爽| 国产日韩欧美在线看| 亚洲三级影院| 国产又色又爽又高潮免费 | 黄上黄在线观看| 92国产精品视频| 久久午夜精品| 精品无码人妻一区二区三| 亚洲小视频在线观看| silk一区二区三区精品视频| 冲田杏梨av在线|