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

深入淺出JavaScript內存泄漏

開發(fā) 前端
每一位Web開發(fā)員可能都整理有一份自己的代碼示例列表,當他們在代碼中看到如列表中的代碼時,他們會意識到泄漏的存在并會使用一些開發(fā)技巧來避免這些問 題。這樣的方法雖然簡單便捷,但這也是今天Web頁面內存泄漏普遍存在的原因。

在過去一些的時候,Web開發(fā)人員并沒有太多的去關注內存泄露問題。那時的頁面間聯系大都比較簡單,并主要使用不同的連接地址在同一個站點中導航,這樣的設計方式是非常有利于瀏覽器釋放資源的。即使Web頁面運行中真的出現了資源泄漏,那它的影響也是非常有限而且常常是不會被人在意的。

51CTO推薦閱讀:早該知道的7個JavaScript技巧

今天人們對Web應用有了高更的要求。一個頁面很可能數小時不會發(fā)生URL跳轉,并同時通過Web服務動態(tài)的更新頁面內容。復雜的事件關聯設計、基于對象的JavaScript和DHTML技術的廣泛采用,使得代碼的能力達到了其承受的極限。在這樣的情況和改變下,弄清楚內存泄露方式變得非常的急迫,特別是過去這些問題都被傳統的頁面導航方法給屏蔽了。

還算好的事情是,當你明確了希望尋找什么時,內存泄露方式是比較容易被確定的。大多數你能遇到的泄露問題我們都已經知道,你只需要少量額外的工作就會給你 帶來好處。雖然在一些頁面中少量的小泄漏問題仍會發(fā)生,但是主要的問題還是很容易解決的。

泄露方式

在接下來的內容中,我們會討論內存泄露方式,并為每種方式給出示例。其中一個重要的示例是JavaScript中的Closure技術,另一個示例是在事件執(zhí)行 中使用Closures。當你熟悉本示例后,你就能找出并修改你已有的大多數內存泄漏問題,但是其它Closure相關的問題可能又會被忽視。

現在讓我們來看看這些個方式都有什么:

 1、循環(huán)引用(Circular References) — IE瀏覽器的COM組件產生的對象實例和網頁腳本引擎產生的對象實例相互引用,就會造成內存泄漏。這也是Web頁面中我們遇到的最常見和主要的泄漏方式;

 2、內部函數引用(Closures) — Closures可以看成是目前引起大量問題的循環(huán)應用的一種特殊形式。由于依賴指定的關鍵字和語法結構,Closures調用是比較容易被我們發(fā)現的;

 3、頁面交叉泄漏(Cross-Page Leaks) — 頁面交叉泄漏其實是一種較小的泄漏,它通常在你瀏覽過程中,由于內部對象薄計引起。下面我們會討論DOM插入順序的問題,在那個示例中你會發(fā)現只需要改動 少量的代碼,我們就可以避免對象薄計對對象構建帶來的影響;

 4、貌似泄漏(Pseudo-Leaks) — 這個不是真正的意義上的泄漏,不過如果你不了解它,你可能會在你的可用內存資源變得越來越少的時候極度郁悶。為了演示這個問題,我們將通過重寫 Script元素中的內容來引發(fā)大量內存的"泄漏"。

循環(huán)引用

循環(huán)引用基本上是所有泄漏的始作俑者。通常情況下,腳本引擎通過垃圾收集器(GC)來處理循環(huán)引用,但是某些未知因數可能會妨礙從其環(huán)境中釋放資源。對于 IE來說,某些DOM對象實例的狀態(tài)是腳本無法得知的。下面是它們的基本原則:

#p#

Figure 1: 基本的循環(huán)引用模型

本模型中引起的泄漏問題基于COM的引用計數。腳本引擎對象會維持對DOM對象的引用,并在清理和釋放DOM對象指針前等待所有引用的移除。在我們的示例 中,我們的腳本引擎對象上有兩個引用:腳本引擎作用域和DOM對象的expando屬性。

當終止腳本引擎時第一個引用會釋放,DOM對象引用由于在等待腳 本擎的釋放而并不會被釋放。你可能會認為檢測并修復假設的這類問題會非常的容易,但事實上這樣基本的的示例只是冰山一角。你可能會在30個對象鏈的末尾發(fā) 生循環(huán)引用,這樣的問題排查起來將會是一場噩夢。如果你仍不清楚這種泄漏方式在HTML代碼里到底怎樣,你可以通過一個全局腳本變量和一個DOM對象來引發(fā)并展現它。

  1. <html> 
  2. <head> 
  3. <script language="JavaScript"> 
  4. var myGlobalObject;  
  5. function SetupLeak()  
  6. {  
  7. // First set up the script scope to element reference  
  8. myGlobalObject = document.getElementById("LeakedDiv");  
  9.  
  10. // Next set up the element to script scope reference  
  11. document.getElementById("LeakedDiv").expandoProperty = myGlobalObject;  
  12. }  
  13.  
  14. function BreakLeak()  
  15. {  
  16. document.getElementById("LeakedDiv").expandoProperty = null;  
  17. }  
  18. </script> 
  19. </head> 
  20. <body onload="SetupLeak()" onunload="BreakLeak()"> 
  21. <div id="LeakedDiv"></div> 
  22. </body> 
  23. </html> 

你可以使用直接賦null值得方式來破壞該泄漏情形。在頁面文檔卸載前賦null值,將會讓腳本引擎知道對象間的引用鏈沒有了。現在它將能正常的清理引用 并釋放DOM對象。在這個示例中,作為Web開發(fā)員的你因該更多的了解了對象間的關系。

作為一個基本的情形,循環(huán)引用可能還有更多不同的復雜表現。對基于對象的JavaScript,一個通常用法是通過封裝JavaScript對象來擴充DOM對象。在 構建過程中,你常常會把DOM對象的引用放入JavaScript對象中,同時在DOM對象中也存放上對新近創(chuàng)建的JavaScript對象的引用。你的這種應用模式 將非常便于兩個對象之間的相互訪問。這是一個非常直接的循環(huán)引用問題,但是由于使用不用的語法形式可能并不會讓你在意。要破環(huán)這種使用情景可能變得更加復 雜,當然你同樣可以使用簡單的示例以便于清楚的討論。

  1. <html> 
  2. <head> 
  3. <script language="JavaScript"> 
  4.  
  5. function Encapsulator(element)  
  6. {  
  7. // Set up our element  
  8. this.elementReference = element;  
  9.  
  10. // Make our circular reference  
  11. element.expandoProperty = this;  
  12. }  
  13.  
  14. function SetupLeak()  
  15. {  
  16. // The leak happens all at once  
  17. new Encapsulator(document.getElementById("LeakedDiv"));  
  18. }  
  19.  
  20. function BreakLeak()  
  21. {  
  22. document.getElementById("LeakedDiv").expandoProperty = null;  
  23. }  
  24. </script> 
  25. </head> 
  26. <body onload="SetupLeak()" onunload="BreakLeak()"> 
  27. <div id="LeakedDiv"></div> 
  28. </body> 
  29. </html> 

更復雜的辦法還有記錄所有需要解除引用的對象和屬性,然后在Web文檔卸載的時候統一清理,但大多數時候你可能會再造成額外的泄漏情形,而并沒有解決你的 問題。

閉包函數(Closures)

由于閉包函數會使程序員在不知不覺中創(chuàng)建出循環(huán)引用,所以它對資源泄漏常常有著不可推卸的責任。而在閉包函數自己被釋放前,我們很難判斷父函數的參數以及 它的局部變量是否能被釋放。實際上閉包函數的使用已經很普通,以致人們頻繁的遇到這類問題時我們卻束手無策。在詳細了解了閉包背后的問題和一些特殊的閉包 泄漏示例后,我們將結合循環(huán)引用的圖示找到閉包的所在,并找出這些不受歡迎的引用來至何處。

#p#

Figure 2. 閉包函數引起的循環(huán)引用

普通的循環(huán)引用,是兩個不可探知的對象相互引用造成的,但是閉包卻不同。代替直接造成引用,閉包函數則取而代之從其父函數作用域中引入信息。通常,函數的 局部變量和參數只能在該被調函數自身的生命周期里使用。當存在閉包函數后,這些變量和參數的引用會和閉包函數一起存在,但由于閉包函數可以超越其父函數的 生命周期而存在,所以父函數中的局部變量和參數也仍然能被訪問。

在下面的示例中,參數1將在函數調用終止時正常被釋放。當我們加入了一個閉包函數后,一個 額外的引用產生,并且這個引用在閉包函數釋放前都不會被釋放。如果你碰巧將閉包函數放入了事件之中,那么你不得不手動從那個事件中將其移出。如果你把閉包 函數作為了一個expando屬性,那么你也需要通過置null將其清除。

同時閉包會在每次調用中創(chuàng)建,也就是說當你調用包含閉包的函數兩次,你將得到兩個獨立的閉包,而且每個閉包都分別擁有對參數的引用。由于這些顯而易見的因 素,閉包確實非常用以帶來泄漏。下面的示例將展示使用閉包的主要泄漏因素:

  1. <html> 
  2. <head> 
  3. <script language="JavaScript"> 
  4.  
  5. function AttachEvents(element)  
  6. {  
  7. // This structure causes element to ref ClickEventHandler  
  8. element.attachEvent("onclick", ClickEventHandler);  
  9.  
  10. function ClickEventHandler()  
  11. {  
  12. // This closure refs element  
  13. }  
  14. }  
  15. function SetupLeak()  
  16. {  
  17. // The leak happens all at once  
  18. AttachEvents(document.getElementById("LeakedDiv"));  
  19. }  
  20.  
  21. function BreakLeak()  
  22. {  
  23. }  
  24. </script> 
  25. </head> 
  26. <body onload="SetupLeak()" onunload="BreakLeak()"> 
  27. <div id="LeakedDiv"></div> 
  28. </body> 
  29. </html> 

如果你對怎么避免這類泄漏感到疑惑,我將告訴你處理它并不像處理普通循環(huán)引用那么簡單。"閉包"被看作函數作用域中的一個臨時對象。一旦函數執(zhí)行退出,你 將失去對閉包本身的引用,那么你將怎樣去調用detachEvent方法來清除引用呢?在Scott Isaacs的MSN Spaces上有一種解決這個問題的有趣方法。

這個方法使用一個額外的引用(原文叫second closure,可是這個示例里致始致終只有一個closure)協助window對象執(zhí)行onUnload事件,由于這個額外的引用和閉包的引用存在于 同一個對象域中,于是我們可以借助它來釋放事件引用,從而完成引用移除。為了簡單起見我們將閉包的引用暫存在一個expando屬性中,下面的示例將向你 演示釋放事件引用和清除expando屬性。

  1. <html> 
  2. <head> 
  3. <script language="JavaScript"> 
  4. function AttachEvents(element)  
  5. {  
  6. // In order to remove this we need to put  
  7. // it somewhere. Creates another ref  
  8. element.expandoClick = ClickEventHandler;  
  9.  
  10. // This structure causes element to ref ClickEventHandler  
  11. element.attachEvent("onclick", element.expandoClick);  
  12.  
  13. function ClickEventHandler()  
  14. {  
  15. // This closure refs element  
  16. }  
  17. }  
  18.  
  19. function SetupLeak()  
  20. {  
  21. // The leak happens all at once  
  22. AttachEvents(document.getElementById("LeakedDiv"));  
  23. }  
  24.  
  25. function BreakLeak()  
  26. {  
  27. document.getElementById("LeakedDiv").detachEvent("onclick",  
  28. document.getElementById("LeakedDiv").expandoClick);  
  29. document.getElementById("LeakedDiv").expandoClick = null;  
  30. }  
  31. </script> 
  32. </head> 
  33. <body onload="SetupLeak()" onunload="BreakLeak()"> 
  34. <div id="LeakedDiv"></div> 
  35. </body> 
  36. </html> 

在這篇文章中,實際上建議我們除非迫不得已盡量不要創(chuàng)建使用閉包。文章中的示例,給我們演示了非閉包的事件引用方式,即把閉包函數放到頁面的全局作用 域中。當閉包函數成為普通函數后,它將不再繼承其父函數的參數和局部變量,所以我們也就不用擔心基于閉包的循環(huán)引用了。在非必要的時候不使用閉包這樣的編 程方式可以盡量使我們的代碼避免這樣的問題。

最后,腳本引擎開發(fā)組的Eric Lippert,給我們帶來了一篇關于閉包使用通俗易懂的好文章。他的最終建議也是希望在真正必要的時候才使用閉包函數。雖然他的文章沒有提及閉包會使用 的真正場景,但是這兒已有的大量示例非常有助于大家起步。

頁面交叉泄漏(Cross-Page Leaks)

這種基于插入順序而常常引起的泄漏問題,主要是由于對象創(chuàng)建過程中的臨時對象未能被及時清理和釋放造成的。它一般在動態(tài)創(chuàng)建頁面元素,并將其添加到頁面 DOM中時發(fā)生。一個最簡單的示例場景是我們動態(tài)創(chuàng)建兩個對象,并創(chuàng)建一個子元素和父元素間的臨時域(譯者注:這里的域(Scope)應該是指管理元素之 間層次結構關系的對象)。

然后,當你將這兩個父子結構元素構成的的樹添加到頁面DOM樹中時,這兩個元素將會繼承頁面DOM中的層次管理域對象,并泄漏之 前創(chuàng)建的那個臨時域對象。下面的圖示示例了兩種動態(tài)創(chuàng)建并添加元素到頁面DOM中的方法。在第一種方法中,我們將每個子元素添加到它的直接父元素中,最后 再將創(chuàng)建好的整棵子樹添加到頁面DOM中。當一些相關條件合適時,這種方法將會由于臨時對象問題引起泄漏。在第二種方法中,我們自頂向下創(chuàng)建動態(tài)元素,并 使它們被創(chuàng)建后立即加入到頁面DOM結構中去。由于每個被加入的元素繼承了頁面DOM中的結構域對象,我們不需要創(chuàng)建任何的臨時域。這是避免潛在內存泄漏 發(fā)生的好方法。

#p#

Figure 3. DOM插入順序泄漏模型

接下來,我們將給出一個躲避了大多數泄漏檢測算法的泄漏示例。因為我們實際上沒有泄漏任何可見的元素,并且由于被泄漏的對象太小從而你可能根本不會注意這 個問題。為了使我們的示例產生泄漏,在動態(tài)創(chuàng)建的元素結構中將不得不內聯的包含一個腳本函數指針。在我們設置好這些元素間的相互隸屬關系后這將會使我們泄 漏內部臨時腳本對象。由于這個泄漏很小,我們不得不將示例執(zhí)行成千上萬次。

事實上,一個對象的泄漏只有很少的字節(jié)。在運行示例并將瀏覽器導航到一個空白頁 面,你將會看到兩個版本代碼在內存使用上的區(qū)別。當我們使用第一種方法,將子元素加入其父元素再將構成的子樹加入頁面DOM,我們的內存使用量會有微小的 上升。這就是一個交叉導航泄漏,只有當我們重新啟動IE進程這些泄漏的內存才會被釋放。如果你使用第二種方法將父元素加入頁面DOM再將子元素加入其父元 素中,同樣運行若干次后,你的內存使用量將不會再上升,這時你會發(fā)現你已經修復了交叉導航泄漏的問題。

  1. <html> 
  2. <head> 
  3. <script language="JavaScript"> 
  4.  
  5. function LeakMemory()  
  6. {  
  7. var hostElement = document.getElementById("hostElement");  
  8.  
  9. // Do it a lot, look at Task Manager for memory response  
  10.  
  11. for(i = 0; i < 5000; i++)  
  12. {  
  13. var parentDiv =  
  14. document.createElement("<div onClick='foo()'>");  
  15. var childDiv =  
  16. document.createElement("<div onClick='foo()'>");  
  17.  
  18. // This will leak a temporary object  
  19. parentDiv.appendChild(childDiv);  
  20. hostElement.appendChild(parentDiv);  
  21. hostElement.removeChild(parentDiv);  
  22. parentDiv.removeChild(childDiv);  
  23. parentDiv = null;  
  24. childDiv = null;  
  25. }  
  26. hostElement = null;  
  27. }  
  28.  
  29. function CleanMemory()  
  30. {  
  31. var hostElement = document.getElementById("hostElement");  
  32.  
  33. // Do it a lot, look at Task Manager for memory response  
  34.  
  35. for(i = 0; i < 5000; i++)  
  36. {  
  37. var parentDiv =  
  38. document.createElement("<div onClick='foo()'>");  
  39. var childDiv =  
  40. document.createElement("<div onClick='foo()'>");  
  41.  
  42. // Changing the order is important, this won't leak  
  43. hostElement.appendChild(parentDiv);  
  44. parentDiv.appendChild(childDiv);  
  45. hostElement.removeChild(parentDiv);  
  46. parentDiv.removeChild(childDiv);  
  47. parentDiv = null;  
  48. childDiv = null;  
  49. }  
  50. hostElement = null;  
  51. }  
  52. </script> 
  53. </head> 
  54.  
  55. <body> 
  56. <button onclick="LeakMemory()">Memory Leaking Insert</button> 
  57. <button onclick="CleanMemory()">Clean Insert</button> 
  58. <div id="hostElement"></div> 
  59. </body> 
  60. </html> 

這類泄漏應該被澄清,因為這個解決方法有悖于我們在IE中的一些有益經驗。創(chuàng)建帶有腳本對象的DOM元素,以及它們已進行的相互關聯是了解這個泄漏的關鍵 點。這實際上這對于泄漏來說是至關重要的,因為如果我們創(chuàng)建的DOM元素不包含任何的腳本對象,同時使用相同的方式將它們進行關聯,我們是不會有任何泄漏 問題的。示例中給出的第二種技巧對于關聯大的子樹結構可能更有效(由于在那個示例中我們一共只有兩個元素,所以建立一個和頁面DOM不相關的樹結構并不會 有什么效率問題)。

第二個技巧是在創(chuàng)建元素的開始不關聯任何的腳本對象,所以你可以安全的創(chuàng)建子樹。當你把你的子樹關聯到頁面DOM上后,再繼續(xù)處理你需 要的腳本事件。牢記并遵守關于循環(huán)引用和閉包函數的使用規(guī)則,你不會再在掛接事件時在你的代碼中遇到不同的泄漏。

我真的要指出這個問題,因為我們可以看出不是所有的內存泄漏都是可以很容易發(fā)現的。它們可能都是些微不足道的問題,但往往需要成千上萬次的執(zhí)行一個更小的 泄漏場景才能使問題顯現出來,就像DOM元素插入順序引起的問題那樣。如果你覺得使用所謂的"最佳"經驗來編程,那么你就可以高枕無憂,但是這個示例讓我 們看到,即使是"最佳"經驗似乎也可能帶來泄漏。我們這里的解決方案希望能提高這些已有的好經驗,或者介紹一些新經驗使我們避免泄漏發(fā)生的可能。

貌似泄漏(Pseudo-Leaks)

在大多數時候,一些APIs的實際的行為和它們預期的行為可能會導致你錯誤的判斷內存泄漏。貌似泄漏大多數時候總是出現在同一個頁面的動態(tài)腳本操作中,而 在從一個頁面跳轉到空白頁面的時候發(fā)生是非常少見的。那你怎么能象排除頁面間泄漏那樣來排除這個問題,并且在新任務運行中的內存使用量是否是你所期望的。 我們將使用腳本文本的重寫來作為一個貌似泄漏的示例。

象DOM插入順序問題那樣,這個問題也需要依賴創(chuàng)建臨時對象來產生"泄漏"。對一個腳本元素對象內部的腳本文本一而再再而三的反復重寫,慢慢地你將開始泄 漏各種已關聯到被覆蓋內容中的腳本引擎對象。特別地,和腳本調試有關的對象被作為完全的代碼對象形式保留了下來。

  1. <html> 
  2. <head> 
  3. <script language="JavaScript"> 
  4. function LeakMemory()  
  5. {  
  6. // Do it a lot, look at Task Manager for memory response  
  7. for(i = 0; i < 5000; i++)  
  8. {  
  9. hostElement.text = "function foo() { }";  
  10. }  
  11. }  
  12. </script> 
  13. </head> 
  14. <body> 
  15. <button onclick="LeakMemory()">Memory Leaking Insert</button> 
  16. <script id="hostElement">function foo() { }</script> 
  17. </body> 
  18. </html> 

如果你運行上面的示例代碼并使用任務管理器查看,當從"泄漏"頁面跳轉到空白頁面時,你并不會注意到任何腳本泄漏。因為這種腳本泄漏完全發(fā)生在頁面內部, 而且當你離開該頁面時被使用的內存就會回收。對于我們原本所期望的行為來說這樣的情況是糟糕的。

你希望當重寫了腳本內容后,原來的腳本對象就應該徹底的從 頁面中消失。但事實上,由于被覆蓋的腳本對象可能已用作事件處理函數,并且還可能有一些未被清除的引用計數。正如你所看到的,這就是貌似泄漏。在表面上內存消耗量可能看起來非常的糟糕,但是這個原因是完全可以接受的。

總結

每一位Web開發(fā)員可能都整理有一份自己的代碼示例列表,當他們在代碼中看到如列表中的代碼時,他們會意識到泄漏的存在并會使用一些開發(fā)技巧來避免這些問 題。這樣的方法雖然簡單便捷,但這也是今天Web頁面內存泄漏普遍存在的原因。考慮我們所討論的泄漏情景而不是關注獨立的代碼示例,你將會使用更加有效的策略來解決泄漏問題。這樣的觀念將使你在設計階段就把問題估計到,并且確保你有計劃來處理潛在的泄漏問題。

使用編寫加固代碼(譯者注:就是異常處理或清理對象等的代碼)的習慣并且采取清理所有自己占用內存的方法。雖然對這個問題來說可能太夸張了,你也可能幾乎從沒有見到編寫腳本卻需要自己清理自己占用的內 存的情況;使這個問題變得越來越顯著的是,腳本變量和expando屬性間存在的潛在泄漏可能。

【編輯推薦】

  1. 關于IE的內存泄漏與JavaScript內存釋放
  2. 揭開Javascript閉包的真實面目
  3. 拔開云霧見明月 透析JavaScript定時機制
  4. 深入解讀JavaScript中BOM和DOM
  5. JavaScript中的函數式編程實踐

 

責任編輯:王曉東 來源: CSDN博客
相關推薦

2022-09-26 09:01:15

語言數據JavaScript

2012-02-21 13:55:45

JavaScript

2022-10-31 09:00:24

Promise數組參數

2023-12-04 13:22:00

JavaScript異步編程

2011-05-30 14:41:09

Javascript閉

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2009-06-22 15:34:00

Javascript

2022-05-26 09:20:01

JavaScript原型原型鏈

2009-06-18 10:23:03

Javascript 基本框架

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構調度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2012-05-21 10:06:26

FrameworkCocoa

2016-12-27 09:10:29

JavaScript原型鏈繼承

2017-10-10 14:36:07

前端Javascriptapply、call、

2019-11-11 14:51:19

Java數據結構Properties

2009-11-30 16:46:29

學習Linux

2018-11-09 16:24:25

物聯網云計算云系統

2021-04-27 08:54:43

ConcurrentH數據結構JDK8
點贊
收藏

51CTO技術棧公眾號

手机福利在线| 无码aⅴ精品一区二区三区浪潮| 国产九色91回来了| 91精品国产成人观看| 日韩精品一区在线观看| 九色自拍视频在线观看| 国产中文在线| 国产精品一二三四五| 午夜精品一区二区三区在线视| www.色天使| 91亚洲精品在看在线观看高清| 亚洲妇熟xx妇色黄| 亚欧洲精品在线视频免费观看| 国产suv精品一区二区69| 亚洲综合日韩| 久久成人亚洲精品| aa一级黄色片| 日韩欧美久久| 欧美三级一区二区| 国产精品入口芒果| 免费网站黄在线观看| 91蜜桃视频在线| 7777精品久久久大香线蕉小说| 亚洲 欧美 日韩 综合| 欧美淫片网站| 在线精品高清中文字幕| 99精品一区二区三区无码吞精| 国产精品亚洲d| 婷婷综合五月天| 欧美交换配乱吟粗大25p| 香蕉视频在线免费看| 国产福利不卡视频| 国产精品亚洲美女av网站| www亚洲视频| 久久九九热re6这里有精品| 欧美视频一区二| 无码播放一区二区三区| 色综合999| 亚洲卡通欧美制服中文| 91在线观看免费观看| 久久久精品毛片| 国产情侣一区| 97精品免费视频| 久久久久久福利| 欧美一区高清| y97精品国产97久久久久久| 影音先锋男人在线| 国产欧美日韩在线一区二区| 国产视频精品xxxx| 一女三黑人理论片在线| 啪啪激情综合网| 亚洲国产成人av在线| 亚洲麻豆一区二区三区| jizz性欧美2| 欧美精品一区视频| 黄色网址在线视频| 日韩精选在线| 日韩电影大全免费观看2023年上| 国产a级黄色片| 美国成人xxx| 日韩激情第一页| 在线免费观看成年人视频| 偷拍亚洲色图| 亚洲老司机av| 色欲狠狠躁天天躁无码中文字幕 | 一区二区不卡在线观看| 91社区在线观看播放| 国产精品电影院| 国产精品亚洲天堂| 色图在线观看| 精品免费在线视频| 日本成人在线免费视频| 欧美成人福利| 日韩一区二区精品| 在线免费观看污视频| 亚洲性视频大全| 一本一道久久a久久精品逆3p| 女人黄色一级片| 伊人青青综合网| 欧美极品xxxx| 亚洲永久精品在线观看| 奇米888四色在线精品| 91精品在线看| 天天干视频在线观看| 久久久三级国产网站| 亚洲午夜精品久久久中文影院av| av在线官网| 欧美特级www| 一本一道久久a久久综合精品 | 亚洲国产精品传媒在线观看| 亚洲精品一区二| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美日韩美女在线| 中文字幕第21页| 一区二区三区免费在线看| 亚洲精品视频播放| 韩国一级黄色录像| 国产欧美三级| 国产综合久久久久久| 黄色av中文字幕| 国产精品伦理在线| 欧美视频在线观看视频| 久久影视精品| 亚洲免费人成在线视频观看| 国产白丝一区二区三区| 日韩视频一区| 96精品久久久久中文字幕| 午夜视频福利在线观看| 最近中文字幕一区二区三区| 人妻少妇精品无码专区二区| 激情中国色综合| 亚洲成色777777在线观看影院| 国产探花视频在线| 一本色道久久| 亚洲影院在线看| 高清av电影在线观看| 亚洲成a人片综合在线| 欧美女同在线观看| 奇米狠狠一区二区三区| 国产+人+亚洲| 99久久精品无免国产免费| 久久久www成人免费无遮挡大片| 小泽玛利亚av在线| 日本a人精品| 亚洲视频在线视频| 欧美亚韩一区二区三区| 国产精品白丝jk黑袜喷水| 午夜精品一区二区三区四区| 小视频免费在线观看| 精品福利一二区| 国产性xxxx| 久久99国内精品| 日韩欧美亚洲精品| 成人性生活av| 日韩电影第一页| 日韩成人免费观看| 成人av先锋影音| 欧美中日韩在线| 亚洲精品一区在线| 欧美另类在线观看| jlzzjlzz亚洲女人18| 自拍av一区二区三区| 精品亚洲一区二区三区四区| 日本女优一区| 国产精品丝袜白浆摸在线| 国产在线黄色| 一本色道a无线码一区v| 中文幕无线码中文字蜜桃| av成人天堂| 久久精品国产99精品国产亚洲性色| 538视频在线| 亚洲丁香婷深爱综合| 伊人国产在线观看| av网站免费线看精品| 免费人成自慰网站| 国产精品毛片av| 97国产一区二区精品久久呦| 天天干天天插天天操| 欧美日韩亚洲系列| 成人免费无遮挡无码黄漫视频| 久久天堂精品| 亚洲二区三区四区| 久久久国产精品入口麻豆 | 搞黄网站在线看| 亚洲成人精品av| 97人人澡人人爽人人模亚洲 | 日韩欧美一级二级三级久久久| 紧身裙女教师波多野结衣| 国产麻豆视频一区| 精品少妇人欧美激情在线观看| 国产精东传媒成人av电影| 69影院欧美专区视频| 精品资源在线看| 欧美精品丝袜中出| 久久视频免费看| ww亚洲ww在线观看国产| 91小视频网站| 亚洲精品成人| 国产在线一区二区三区欧美 | 最新成人av网站| 欧美国产二区| gogo大尺度成人免费视频| 久久久久久久国产| 国产1区2区3区在线| 91精品国产综合久久精品| 豆国产97在线 | 亚洲| 久久午夜羞羞影院免费观看| 天堂网在线免费观看| 欧美精品一线| 欧洲精品一区色| 国产一区二区三区精品在线观看| 午夜精品久久久久久久久久久久| 国内三级在线观看| 日韩视频免费观看高清完整版在线观看| 免费日韩一级片| 国产精品激情偷乱一区二区∴| 少妇献身老头系列| 视频在线观看一区二区三区| 路边理发店露脸熟妇泻火| 希岛爱理av免费一区二区| 成人国产精品一区二区| 嗯啊主人调教在线播放视频| 最新69国产成人精品视频免费| 成人免费一级视频| 欧美日韩一区二区在线观看 | 欧美日韩精品欧美日韩精品| 久草免费在线观看视频| 日本一区免费视频| 久久人妻少妇嫩草av无码专区| 久久成人羞羞网站| 国产精品沙发午睡系列| 亚洲激情五月| 日韩精品久久一区| 你懂的在线观看一区二区| 成人福利在线观看| 日本精品网站| 欧美中文字幕在线观看| 大香伊人久久| 久久亚洲电影天堂| 东凛在线观看| 日韩国产精品一区| 亚洲精品无码专区| 制服.丝袜.亚洲.中文.综合| 亚洲中文一区二区| 精品久久久久久久久久ntr影视| 国产美女福利视频| 国产女主播一区| 毛茸茸多毛bbb毛多视频| 国产高清精品网站| 午夜不卡福利视频| 久久成人精品无人区| 青青青在线视频免费观看| 国产欧美91| 久久亚洲中文字幕无码| 激情自拍一区| 天堂а√在线中文在线| 亚洲一区二区三区| 中文字幕av导航| 午夜精品一区二区三区国产 | 日本在线人成| 国产亚洲一区二区在线| 青青国产在线| 精品在线小视频| 九色网友自拍视频手机在线| 亚洲美腿欧美激情另类| 久久电影视频| 亚洲欧洲黄色网| 久久手机免费观看| 国产亚洲精品va在线观看| 邻居大乳一区二区三区| 亚洲人成亚洲人成在线观看| 精品三级久久久久久久电影聊斋| 亚洲精品在线观看www| 可以在线观看的av| 国产一区二区三区直播精品电影| 高清美女视频一区| xxx成人少妇69| 免费在线观看黄色| 美女福利视频一区| 爱看av在线入口| 人妖精品videosex性欧美| 欧美gay囗交囗交| 国产美女精品视频免费观看| 性欧美video另类hd尤物| 96国产粉嫩美女| 精品女人视频| 欧美精品在线一区| 色一区二区三区四区| 精品一区二区成人免费视频| 欧美激情四色| 久久综合九色综合88i| 久久精品盗摄| 99re精彩视频| 国产成人丝袜美腿| 亚洲精品乱码久久久久久不卡| 久久久另类综合| 在线视频这里只有精品| 亚洲一区影音先锋| 久久国产黄色片| 欧美日韩国产乱码电影| 午夜美女福利视频| 日韩精品福利在线| 91在线不卡| 久久久久国产精品www| 日本综合字幕| 91精品在线观看视频| 小嫩嫩12欧美| 欧美亚洲视频一区| 国产美女诱惑一区二区| 成人亚洲免费视频| 99热精品国产| 大地资源高清在线视频观看| 午夜电影一区二区三区| 中文字幕在线播放日韩| 亚洲精品一区二区三区影院 | 色综合色综合久久综合频道88| av手机在线观看| 国产欧美日韩高清| 欧美a级网站| 今天免费高清在线观看国语| 国产免费成人| 亚洲少妇一区二区| 中文字幕在线一区免费| 在线观看黄网站| 91精品福利在线一区二区三区 | 日韩精品中文字幕一区二区 | 色婷婷一区二区| www.成人在线观看| 中文字幕日韩在线观看| 丁香花视频在线观看| 成人精品一区二区三区电影免费| 欧美性生活一级片| 日韩不卡视频一区二区| 日本中文字幕一区二区视频| 中文字幕在线视频播放| 成人欧美一区二区三区黑人麻豆 | 热久久免费视频| 欧美肉大捧一进一出免费视频| 成人免费在线观看入口| 亚洲精品一区二三区| 亚洲国产日韩欧美在线动漫| 国产在线观看免费麻豆| 国产精品第100页| 全国精品免费看| 欧日韩免费视频| 国产经典欧美精品| 国产精品嫩草影院俄罗斯| 欧美这里有精品| 久久国产精品高清一区二区三区| 97精品久久久中文字幕免费| 91麻豆精品激情在线观看最新| 异国色恋浪漫潭| 久久99国产乱子伦精品免费| 国产午夜精品福利视频| 日韩欧美在线播放| 亚洲人妻一区二区| 9.1国产丝袜在线观看| 国产美女撒尿一区二区| 国产精品va在线观看无码| 国产成人av电影免费在线观看| 黄色香蕉视频在线观看| 欧美日本在线视频| 一区二区三区视频在线观看视频| 国产精品久久久久久久一区探花| 九九热线有精品视频99| 久久国产色av免费观看| 久久久精品影视| 国产91av在线播放| 中文字幕久久久| 久久99国产精品二区高清软件| 视频在线精品一区| 奇米影视7777精品一区二区| 懂色av蜜臀av粉嫩av永久| 欧美美女激情18p| 含羞草www国产在线视频| 18成人在线| 韩日成人av| 好吊色视频一区二区三区| 五月综合激情婷婷六月色窝| 熟妇高潮一区二区高潮| 欧美一乱一性一交一视频| 国产欧美亚洲精品a| 视频二区在线播放| 亚洲欧美国产高清| 成人久久久精品国产乱码一区二区| 久久久久中文字幕2018| 日韩一级电影| 中文字幕一区二区三区四区在线视频| 国产精品三级在线观看| 亚洲中文字幕一区二区| 欧美成人国产va精品日本一级| 国产精品videossex| av观看免费在线| 国产精品视频免费| va婷婷在线免费观看| 91wwwcom在线观看| 欧美日韩老妇| 色男人天堂av| 精品国产福利在线| 9i精品一二三区| julia一区二区中文久久94| 亚洲狼人精品一区二区三区| 亚洲最大成人网站| 911精品国产一区二区在线| www欧美xxxx| 日本视频一区二区不卡| 国产一区二区0| 成人免费看片98欧美| 色婷婷av一区二区三区久久| 亚洲欧美日本国产| 黄色一级免费大片| 亚洲精品乱码久久久久久久久 | 中文字幕在线播放日韩| 欧美日韩国产成人| 红桃视频在线观看一区二区| 丰满人妻一区二区三区53视频| 欧美性极品xxxx娇小| 成人免费网址| 日本成人黄色| 成人福利在线看|