精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日本一区二区三区视频在线看 | 亚洲草久电影| 欧美巨大另类极品videosbest| 亚洲一区三区视频在线观看| 国产丰满美女做爰| 夜夜嗨av一区二区三区网站四季av| 日韩成人xxxx| 中文字幕 欧美日韩| gogo久久| 国产精品你懂的| 国产精品乱码视频| 国产成人自拍偷拍| 欧美日韩免费| 在线性视频日韩欧美| 不许穿内裤随时挨c调教h苏绵 | 欧美视频日韩| 一区二区三区四区精品| 69亚洲乱人伦| 巨大黑人极品videos精品| 亚洲国产成人高清精品| 一区二区日本伦理| 三级理论午夜在线观看| 国产九色精品成人porny| 国产精品18久久久久久首页狼| 久久久久久免费观看| 日韩精品一卡| 成人免费电影网址| 精品视频在线免费| aa在线免费观看| 色黄网站在线观看| 中文字幕在线一区| 日韩视频在线观看国产| 五月婷婷在线播放| 成人午夜私人影院| 亚洲一区中文字幕在线观看| 艳妇乳肉豪妇荡乳av无码福利| 在线欧美三区| 九九九久久久久久| 日本黄色录像视频| japanese国产精品| 亚洲天天在线日亚洲洲精| xfplay5566色资源网站| 亚洲va欧美va人人爽成人影院| 欧美日韩你懂的| 9久久婷婷国产综合精品性色 | 精品成人一区二区三区免费视频| 成人国产精品免费观看视频| 91香蕉嫩草影院入口| 一级爱爱免费视频| 麻豆精品新av中文字幕| 国产精品欧美亚洲777777| 午夜一区二区三区四区| 日韩电影在线一区| 国产精品福利在线| 一区二区视频免费| 美日韩一级片在线观看| 国产精品久久久久久亚洲影视| 久久国产视频一区| 亚洲免费一区二区| 国产不卡视频在线| 国产污视频网站| 久久综合九色| 国产精品久久久久久久久久免费 | 麻豆精品一二三| 国产欧美一区二区| 国产精品自拍电影| 国产不卡一区视频| 国模一区二区三区私拍视频| 天天综合天天综合| 久久亚洲综合av| 视频二区一区| 国产资源在线观看| 成人午夜在线视频| 欧美成ee人免费视频| 成人在线免费观看| **网站欧美大片在线观看| 国产欧美自拍视频| ririsao久久精品一区| 欧美性xxxxx| 亚洲黄色小视频在线观看| 亚洲伦理一区二区| 亚洲白拍色综合图区| 一级性生活大片| 日韩欧美伦理| 欧美高清视频在线观看| 欧美三级一区二区三区| 日韩在线播放一区二区| 成人免费大片黄在线播放| 丁香六月天婷婷| 久久精品一区二区三区四区| 亚洲欧洲精品一区二区三区波多野1战4 | ****av在线网毛片| 欧洲中文字幕精品| 国产麻豆剧传媒精品国产| 久久动漫网址| 久久精品国产久精国产思思| 亚洲国产精品成人无久久精品| 老色鬼久久亚洲一区二区| 91久久久久久| 青青国产在线| 亚洲久本草在线中文字幕| 黄色一级视频片| 不卡的国产精品| 日韩国产高清视频在线| 国产十六处破外女视频| 亚洲综合国产| 国产成人精品免费视频大全最热 | 亚洲第九十九页| 成人av免费网站| 日韩视频专区| 久久青草伊人| 69精品人人人人| 91国产精品视频在线| 亚洲免费看av| 成人自拍在线| 丝袜一区二区三区| 精品无码一区二区三区爱欲| 高清在线视频不卡| 欧美色欧美亚洲另类二区| 性感美女一区二区三区| 天天射,天天干| 国产精品久久夜| 日日橹狠狠爱欧美超碰| 中文字幕不卡在线视频极品| 蜜桃色一区二区三区| 国产精品一线天粉嫩av| 欧美日韩国产va另类| 黄色一区二区视频| 中文文精品字幕一区二区| 91嫩草在线视频| 久热av在线| 国产精品传媒入口麻豆| 欧美亚洲另类色图| 成人看片黄a免费看视频| 久久精品在线视频| 6—12呦国产精品| 国产富婆一级全黄大片| 老司机aⅴ在线精品导航 | 宅男噜噜噜66一区二区66| avove在线观看| 欧美特黄aaaaaaaa大片| 亚洲国产精品久久久久秋霞不卡| 欧美性猛交xxxxx少妇| 热久久国产精品| 欧美不卡福利| 日韩精品免费观看视频| а天堂中文最新一区二区三区| 18欧美乱大交hd1984| 久久午夜夜伦鲁鲁一区二区| 高清精品视频| 欧美aaa大片视频一二区| 亚洲国产另类久久精品 | 国产成人精品毛片| 日韩美女啊v在线免费观看| 五月婷婷丁香色| 青青草综合网| 在线欧美视频| 国产成人亚洲综合91精品| 日韩三级电影网| 黄色精品在线看| 国产白嫩美女无套久久| 欧美中文日韩| 日韩欧美一区二区三区四区五区| 国产韩日精品| 亚洲午夜极品| 91欧美精品午夜性色福利在线| 1024免费在线视频| 欧美日韩精品是欧美日韩精品| 天堂资源在线视频| 国产精品一二三四| 男人插女人视频在线观看| 日韩av系列| 欧美极品另类videosde| 国产av天堂无码一区二区三区| 给我免费播放日韩视频| 日韩av电影手机在线观看| 国产午夜精品一区理论片| 欧美日韩一区二区三区在线看 | 精品国产免费无码久久久| 亚洲一区二区三区四区的| 疯狂揉花蒂控制高潮h| 日韩vs国产vs欧美| 九一免费在线观看| 最新国产一区| 92看片淫黄大片欧美看国产片 | 中文字幕免费一区二区三区| 国产在线精品一区| 国产激情欧美| 久久久中文字幕| 阿v免费在线观看| 日韩免费高清av| 日本久久综合网| 亚洲精品国产无天堂网2021| 日本aaa视频| 国产麻豆一精品一av一免费| 无码播放一区二区三区| 91视频综合| 久久精品99久久| 国产电影一区| 国产成人激情视频| 欧美另类tv| 神马久久久久久| 免费毛片在线| 欧美变态tickling挠脚心| 波多野结衣大片| 亚洲成人激情综合网| 日韩在线观看免| 久久午夜电影网| 人妖粗暴刺激videos呻吟| 美女视频网站久久| 久久人妻精品白浆国产| 在线成人av| 午夜啪啪福利视频| 成人在线免费观看视频| 久久国产精品-国产精品| 精品999日本久久久影院| 欧美最猛性xxxxx免费| 神马午夜伦理不卡| 久久精品色欧美aⅴ一区二区| 色视频在线看| 日韩的一区二区| 国产浮力第一页| 欧美日韩你懂得| 波多野结衣一区二区三区四区| 亚洲成人资源在线| 免费一级a毛片夜夜看 | 懂色av一区二区在线播放| 日韩中文字幕a| 日本强好片久久久久久aaa| 欧美 丝袜 自拍 制服 另类| 亚洲国产专区| 男人天堂a在线| 中文无码久久精品| 男女h黄动漫啪啪无遮挡软件| 成人在线电影在线观看视频| 神马影院一区二区三区| 精品国产成人| 日韩国产欧美一区| 欧美限制电影| 亚洲成人av动漫| 欧美性感美女一区二区| 亚洲精品国产精品国自产观看| 自拍偷拍欧美一区| 日本婷婷久久久久久久久一区二区| 精品一区免费| 日韩国产在线一区| 日韩精品免费一区二区三区| 偷拍视频一区二区| 久久在线电影| 日韩视频在线免费播放| 亚洲最新av| 日韩成人三级视频| 夜夜嗨一区二区三区| 色综合av综合无码综合网站| 乱码第一页成人| 自拍偷拍 国产| 久久精品二区亚洲w码| 亚洲精品性视频| 国产成人av电影免费在线观看| 男人的天堂影院| 久久久精品一品道一区| 国产精品久久久久久成人| 中文字幕一区二区三区乱码在线 | 国产三级视频网站| 久久久久久夜精品精品免费| 国产高清一区二区三区四区| 国产精品丝袜91| 欧美三根一起进三p| 精品成人乱色一区二区| 免费av中文字幕| 欧美日本在线视频| 亚洲欧美另类综合| 国产视频精品免费播放| 日韩精品毛片| 国模精品视频一区二区三区| 在线一区av| 国产美女久久久| 成人av动漫| 日韩久久不卡| 欧美日韩综合| 91免费黄视频| 欧美aa在线视频| 911亚洲精选| 中文在线一区二区| 国产在线综合网| 欧美午夜精品一区二区蜜桃| 99久久一区二区| 亚洲欧美国产一本综合首页| 国产成人高清精品| 日本精品久久久久久久| 国产亚洲亚洲国产一二区| 精品伦精品一区二区三区视频| 凹凸成人精品亚洲精品密奴| 国产性生活免费视频| 日韩av中文字幕一区二区三区| 亚洲AV成人精品| 日本一区免费视频| 国产无套内射又大又猛又粗又爽| 欧美三级在线播放| 手机看片福利在线| 久久久国产影院| 欧美日韩五码| 国产日韩欧美一区二区| 亚洲香蕉av| 九九热在线免费| 91蜜桃在线观看| 青春草免费视频| 欧美浪妇xxxx高跟鞋交| 牛牛影视精品影视| 欧美激情亚洲国产| 国产精品视频一区二区三区综合| 日本不卡一区二区三区视频| 亚洲黄色天堂| 日韩精品视频网址| 国产欧美精品国产国产专区| 亚洲天堂日韩av| 日韩久久久久久| 国产激情小视频在线| 国产精品久久激情| 精品国产一区二区三区噜噜噜| 欧美黑人经典片免费观看| 国产成人免费在线观看| 国产一区二区精彩视频| 欧美日韩精品二区第二页| 九九在线视频| 日本精品一区二区三区在线播放视频 | 毛片av在线| 国产精品中文字幕在线观看| 视频精品在线观看| 69堂免费视频| 99re8在线精品视频免费播放| 久艹视频在线观看| 精品久久久久久最新网址| 中文字幕资源网在线观看| 96pao国产成视频永久免费| 999久久久免费精品国产| 黄色永久免费网站| 国产精品欧美一级免费| 丰满人妻一区二区三区四区| 亚洲无av在线中文字幕| 色婷婷综合久久久中字幕精品久久| 久久一区免费| 亚洲一区二区毛片| 能免费看av的网站| 91福利精品第一导航| 成人影视在线播放| 国产精品永久免费| 97偷自拍亚洲综合二区| 性生活免费在线观看| 中文字幕制服丝袜一区二区三区| 夜夜嗨av禁果av粉嫩avhd| 色哟哟亚洲精品一区二区| 久久三级毛片| 国产成人亚洲综合无码| 高清在线观看日韩| 日韩美女黄色片| 日韩精品久久久久久久玫瑰园| 成人av三级| 亚洲一区二三| 国产精品18久久久久久久久久久久| 欧美精品一级片| 亚洲国产婷婷香蕉久久久久久| 中国色在线日|韩| 香蕉久久夜色| 国产一区二区伦理片| 日韩精品一区三区| 亚洲视频欧洲视频| 99er精品视频| 中国丰满熟妇xxxx性| 久久亚洲一区二区三区明星换脸| 国产三级理论片| 欧美另类老女人| 日韩一级电影| 91高清国产视频| 亚洲v日本v欧美v久久精品| 毛片在线免费| 成人免费淫片视频软件| 最新日韩av| 亚洲精品电影院| 亚洲国产第一页| 久久夜夜久久| 日本少妇高潮喷水视频| 国产精品黄色在线观看| 噜噜噜久久,亚洲精品国产品| 国产精品第10页| 欧美 日韩 国产精品免费观看| 国产 中文 字幕 日韩 在线| 欧美在线999| 成年人视频免费在线播放| 日本一区视频在线| 国产成+人+日韩+欧美+亚洲| 波多野结衣视频免费观看| 欧美第一淫aaasss性| 加勒比久久综合| 欧美激情一区二区三区p站| 欧美日韩一区高清| 97成人资源| 欧美一级视频在线播放| 中文字幕在线不卡国产视频| 深夜福利视频一区|