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

Node.js 中內(nèi)存泄漏分析

安全 漏洞
內(nèi)存泄漏(Memory Leak)指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。如果內(nèi)存泄漏的位置比較關(guān)鍵,那么隨著處理的進(jìn)行可能持有越來(lái)越多的無(wú)用內(nèi)存,這些無(wú)用的內(nèi)存變多會(huì)引起服務(wù)器響應(yīng)速度變慢,嚴(yán)重的情況下導(dǎo)致內(nèi)存達(dá)到某個(gè)極限(可能是進(jìn)程的上限,如 v8 的上限;也可能是系統(tǒng)可提供的內(nèi)存上限)會(huì)使得應(yīng)用程序崩潰。

內(nèi)存泄漏(Memory Leak)指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。如果內(nèi)存泄漏的位置比較關(guān)鍵,那么隨著處理的進(jìn)行可能持有越來(lái)越多的無(wú)用內(nèi)存,這些無(wú)用的內(nèi)存變多會(huì)引起服務(wù)器響應(yīng)速度變慢,嚴(yán)重的情況下導(dǎo)致內(nèi)存達(dá)到某個(gè)極限(可能是進(jìn)程的上限,如 v8 的上限;也可能是系統(tǒng)可提供的內(nèi)存上限)會(huì)使得應(yīng)用程序崩潰。

傳統(tǒng)的 C/C++ 中存在野指針,對(duì)象用完之后未釋放等情況導(dǎo)致的內(nèi)存泄漏。而在使用虛擬機(jī)執(zhí)行的語(yǔ)言中如 Java、JavaScript 由于使用了 GC (Garbage Collection,垃圾回收)機(jī)制自動(dòng)釋放內(nèi)存,使得程序員的精力得到的極大的解放,不用再像傳統(tǒng)語(yǔ)言那樣時(shí)刻對(duì)于內(nèi)存的釋放而戰(zhàn)戰(zhàn)兢兢。

但是,即便有了 GC 機(jī)制可以自動(dòng)釋放,但這并不意味這內(nèi)存泄漏的問(wèn)題不存在了。內(nèi)存泄漏依舊是開發(fā)者們不能繞過(guò)的一個(gè)問(wèn)題,今天讓我們來(lái)了解如何分析 Node.js 中的內(nèi)存泄漏。

GC in Node.js

Node.js 使用 V8 作為 JavaScript 的執(zhí)行引擎,所以討論 Node.js 的 GC 情況就等于在討論 V8 的 GC。在 V8 中一個(gè)對(duì)象的內(nèi)存是否被釋放,是看程序中是否還有地方持有改對(duì)象的引用。

在 V8 中,每次 GC 時(shí),是根據(jù) root 對(duì)象 (瀏覽器環(huán)境下的 window,Node.js 環(huán)境下的 global ) 依次梳理對(duì)象的引用,如果能從 root 的引用鏈到達(dá)訪問(wèn),V8 就會(huì)將其標(biāo)記為可到達(dá)對(duì)象,反之為不可到達(dá)對(duì)象。被標(biāo)記為不可到達(dá)對(duì)象(即無(wú)引用的對(duì)象)后就會(huì)被 V8 回收。更多細(xì)節(jié),可以參見(jiàn) alinode 的 解讀 V8 GC。

了解上述的點(diǎn)之后,你就會(huì)知道,在 Node.js 中內(nèi)存泄露的原因就是本該被清除的對(duì)象,被可到達(dá)對(duì)象引用以后,未被正確的清除而常駐內(nèi)存。

內(nèi)存泄漏的幾種情況

一、全局變量

 

  1. a = 10;  
  2. //未聲明對(duì)象。  
  3. global.b = 11;  
  4. //全局變量引用 

這種比較簡(jiǎn)單的原因,全局變量直接掛在 root 對(duì)象上,不會(huì)被清除掉。

二、閉包

 

  1. function out() {  
  2. const bigData = new Buffer(100);  
  3. inner = function () {  
  4. void bigData;  
  5.  

閉包會(huì)引用到父級(jí)函數(shù)中的變量,如果閉包未釋放,就會(huì)導(dǎo)致內(nèi)存泄漏。上面例子是 inner 直接掛在了 root 上,那么每次執(zhí)行 out 函數(shù)所產(chǎn)生的 bigData 都不會(huì)釋放,從而導(dǎo)致內(nèi)存泄漏。

需要注意的是,這里舉得例子只是簡(jiǎn)單的將引用掛在全局對(duì)象上,實(shí)際的業(yè)務(wù)情況可能是掛在某個(gè)可以從 root 追溯到的對(duì)象上導(dǎo)致的。

三、事件監(jiān)聽

Node.js 的事件監(jiān)聽也可能出現(xiàn)的內(nèi)存泄漏。例如對(duì)同一個(gè)事件重復(fù)監(jiān)聽,忘記移除(removeListener),將造成內(nèi)存泄漏。這種情況很容易在復(fù)用對(duì)象上添加事件時(shí)出現(xiàn),所以事件重復(fù)監(jiān)聽可能收到如下警告:

  1. (node:2752) Warning: Possible EventEmitter memory leak detected。11 haha listeners added。Use emitter。setMaxListeners() to increase limit 

例如,Node.js 中 Agent 的 keepAlive 為 true 時(shí),可能造成的內(nèi)存泄漏。當(dāng) Agent keepAlive 為 true 的時(shí)候,將會(huì)復(fù)用之前使用過(guò)的 socket,如果在 socket 上添加事件監(jiān)聽,忘記清除的話,因?yàn)?socket 的復(fù)用,將導(dǎo)致事件重復(fù)監(jiān)聽從而產(chǎn)生內(nèi)存泄漏。

原理上與前一個(gè)添加事件監(jiān)聽的時(shí)候忘了清除是一樣的。在使用 Node.js 的 http 模塊時(shí),不通過(guò) keepAlive 復(fù)用是沒(méi)有問(wèn)題的,復(fù)用了以后就會(huì)可能產(chǎn)生內(nèi)存泄漏。所以,你需要了解添加事件監(jiān)聽的對(duì)象的生命周期,并注意自行移除。

關(guān)于這個(gè)問(wèn)題的實(shí)例,可以看 Github 上的 issues(node Agent keepAlive 內(nèi)存泄漏)

四、其他原因

還有一些其他的情況可能會(huì)導(dǎo)致內(nèi)存泄漏,比如緩存。在使用緩存的時(shí)候,得清楚緩存的對(duì)象的多少,如果緩存對(duì)象非常多,得做限制***緩存數(shù)量處理。還有就是非常占用 CPU 的代碼也會(huì)導(dǎo)致內(nèi)存泄漏,服務(wù)器在運(yùn)行的時(shí)候,如果有高 CPU 的同步代碼,因?yàn)镹ode.js 是單線程的,所以不能處理處理請(qǐng)求,請(qǐng)求堆積導(dǎo)致內(nèi)存占用過(guò)高。

定位內(nèi)存泄漏

一、重現(xiàn)內(nèi)存泄漏情況

想要定位內(nèi)存泄漏,通常會(huì)有兩種情況:

  1. 對(duì)于只要正常使用就可以重現(xiàn)的內(nèi)存泄漏,這是很簡(jiǎn)單的情況只要在測(cè)試環(huán)境模擬就可以排查了。
  2. 對(duì)于偶然的內(nèi)存泄漏,一般會(huì)與特殊的輸入有關(guān)系。想穩(wěn)定重現(xiàn)這種輸入是很耗時(shí)的過(guò)程。如果不能通過(guò)代碼的日志定位到這個(gè)特殊的輸入,那么推薦去生產(chǎn)環(huán)境打印內(nèi)存快照了。需要注意的是,打印內(nèi)存快照是很耗 CPU 的操作,可能會(huì)對(duì)線上業(yè)務(wù)造成影響。

快照工具推薦使用 heapdump 用來(lái)保存內(nèi)存快照,使用 devtool 來(lái)查看內(nèi)存快照。使用 heapdump 保存內(nèi)存快照時(shí),只會(huì)有 Node.js 環(huán)境中的對(duì)象,不會(huì)受到干擾(如果使用 node-inspector 的話,快照中會(huì)有前端的變量干擾)。

PS:安裝 heapdump 在某些 Node.js 版本上可能出錯(cuò),建議使用 npm install heapdump -target=Node.js 版本來(lái)安裝。

二、打印內(nèi)存快照

將 heapdump 引入代碼中,使用 heapdump.writeSnapshot 就可以打印內(nèi)存快照了了。為了減少正常變量的干擾,可以在打印內(nèi)存快照之前會(huì)調(diào)用主動(dòng)釋放內(nèi)存的 gc() 函數(shù)(啟動(dòng)時(shí)加上 –expose-gc 參數(shù)即可開啟)。

 

  1. const heapdump = require('heapdump');  
  2. const save = function () { 
  3.   gc(); 
  4.   heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot'); 

在打印線上的代碼的時(shí)候,建議按照內(nèi)存增長(zhǎng)情況來(lái)打印快照。heapdump 可以使用 kill 向程序發(fā)送信號(hào)來(lái)打印內(nèi)存快照(只在 *nix 系統(tǒng)上提供)。

  1. kill -USR2  

推薦打印 3 個(gè)內(nèi)存快照,一個(gè)是內(nèi)存泄漏之前的內(nèi)存快照,一個(gè)是少量測(cè)試以后的內(nèi)存快照,還有一個(gè)是多次測(cè)試以后的內(nèi)存快照。

***個(gè)內(nèi)存快照作為對(duì)比,來(lái)查看在測(cè)試后有哪些對(duì)象增長(zhǎng)。在內(nèi)存泄漏不明顯的情況下,可以與大量測(cè)試以后的內(nèi)存快照對(duì)比,這樣能更容易定位。

三、對(duì)比內(nèi)存快照找出泄漏位置

通過(guò)內(nèi)存快照找到數(shù)量不斷增加的對(duì)象,找到增加對(duì)象是被誰(shuí)給引用,找到問(wèn)題代碼,改正之后就行,具體問(wèn)題具體分析,這里通過(guò)我們?cè)诠ぷ髦杏龅降那闆r來(lái)講解。

 

  1. const {EventEmitter} = require('events'); 
  2. const heapdump = require('heapdump'); 
  3.  
  4. global.test = new EventEmitter(); 
  5. heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');  
  6. function run3() { 
  7.   const innerData = new Buffer(100); 
  8.   const outClosure3 = function () { 
  9.     void innerData; 
  10.   }; 
  11.   test.on('error', () => { 
  12.     console.log('error'); 
  13.   }); 
  14.   outClosure3(); 
  15.  
  16. for(let i = 0; i < 10; i++) { 
  17.   run3(); 
  18. gc();  
  19. heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot'); 

這里是對(duì)錯(cuò)誤代碼的最小重現(xiàn)代碼。

首先使用 node –expose-gc index.js 運(yùn)行代碼,將會(huì)得到兩個(gè)內(nèi)存快照,之后打開 devtool,點(diǎn)擊 profile,載入內(nèi)存快照。打開對(duì)比,Delta 會(huì)顯示對(duì)象的變化情況,如果對(duì)象 Delta 一直增長(zhǎng),就很有可能是內(nèi)存泄漏了。

Node.js 中內(nèi)存泄漏分析

可以看到有三處對(duì)象明顯增長(zhǎng)的地方,閉包、上下文以及 Buffer 對(duì)象增長(zhǎng)。點(diǎn)擊查看一下對(duì)象的引用情況:

Node.js 中內(nèi)存泄漏分析

其實(shí)這三處對(duì)象增長(zhǎng)都是一個(gè)問(wèn)題導(dǎo)致的。test 對(duì)象中的 error 監(jiān)聽事件中閉包引用了 innerData 對(duì)象,導(dǎo)致 buffer 沒(méi)有被清除,從而導(dǎo)致內(nèi)存泄漏。

其實(shí)這里的 error 監(jiān)聽事件中沒(méi)有引用 innerData 為什么會(huì)閉包引用了 innerData 對(duì)象,這個(gè)問(wèn)題很是疑惑,后來(lái)弄清是 V8 的優(yōu)化問(wèn)題,在文末會(huì)額外講解一下。對(duì)于對(duì)比快照找到問(wèn)題,得看你對(duì)代碼的熟悉程度,還有眼力了。

如何避免內(nèi)存泄漏

文中的例子基本都可以很清楚的看出內(nèi)存泄漏,但是在工作中,代碼混合上業(yè)務(wù)以后就不一定能很清楚的看出內(nèi)存泄漏了,還是得依靠工具來(lái)定位內(nèi)存泄漏。另外下面是一些避免內(nèi)存泄漏的方法。

ESLint 檢測(cè)代碼檢查非期望的全局變量。

使用閉包的時(shí)候,得知道閉包了什么對(duì)象,還有引用閉包的對(duì)象何時(shí)清除閉包。***可以避免寫出復(fù)雜的閉包,因?yàn)閺?fù)雜的閉包引起的內(nèi)存泄漏,如果沒(méi)有打印內(nèi)存快照的話,是很難看出來(lái)的。

綁定事件的時(shí)候,一定得在恰當(dāng)?shù)臅r(shí)候清除事件。在編寫一個(gè)類的時(shí)候,推薦使用 init 函數(shù)對(duì)類的事件監(jiān)聽進(jìn)行綁定和資源申請(qǐng),然后 destroy 函數(shù)對(duì)事件和占用資源進(jìn)行釋放。

額外說(shuō)明

在做了很多測(cè)試以后得到下面關(guān)于閉包的總結(jié)。

 

  1. class Test{}; 
  2. global.test = new Test() 
  3. function run5(bigData) { 
  4.   const innerData = new Buffer(100);  
  5.   // 被閉包引用,創(chuàng)建一個(gè) context: context1。 
  6.   // context1 引用 bigData,innerData。 
  7.   // closure 為 function run5() 
  8.   // run5函數(shù)沒(méi)有 context,所以 context1 沒(méi)有previous。 
  9.   // 在 run5中新建的函數(shù)將綁定上 context1。  
  10.   test.outClosure5 = function () {  
  11.     // 此函數(shù)閉包 context 指向 context1。  
  12.     void bigData; 
  13.     const closureData = new Buffer(100);  
  14.     // 被閉包使用,創(chuàng)建 context: context2。 
  15.     // outClosure5 函數(shù)有 context1,previous 指向 context1。 
  16.     // 在 outClosure5 中新建的函數(shù)將綁定上context2。  
  17.     test.innerClosure5 = function () {  
  18.       // 此函數(shù)閉包 context 指向 context2。  
  19.       void innerData;     } 
  20.     test.innerClosure5_1 = function () {  
  21.       // 此函數(shù)閉包 context 指向 context2。  
  22.       void closureData; 
  23.     } 
  24.   }; 
  25.   test.outClosure5_1 = function () {  
  26.   } 
  27.   test.outClosure5(); 
  28.  
  29. run5(new Buffer(1000)); 

V8 會(huì)生成一個(gè) context 內(nèi)部對(duì)象來(lái)實(shí)現(xiàn)閉包。下面是 V8 生成 context 的規(guī)則。

  • V8 會(huì)在被閉包引用變量聲明處創(chuàng)建一個(gè) context2,如果被閉包的變量所在函數(shù)擁有 context1 ,則創(chuàng)建的 contex
  • t2 的 previous指向函數(shù) context1。在被閉包引用變量的函數(shù)內(nèi)新建的函數(shù)將會(huì)綁定上 context2。

由于這個(gè)和 V8版本相關(guān),這里只測(cè)試了 v6.2.2 和 v6.10.1 還有 v7.7.1,都是相同的情況。如果想實(shí)踐測(cè)試可以在這個(gè) repo 上了解更多。

責(zé)任編輯:未麗燕 來(lái)源: 碼農(nóng)網(wǎng)
相關(guān)推薦

2017-03-20 13:43:51

Node.js內(nèi)存泄漏

2020-01-03 16:04:10

Node.js內(nèi)存泄漏

2025-10-15 00:26:20

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2025-01-08 08:47:44

Node.js內(nèi)存泄露定時(shí)器

2023-06-30 23:25:46

HTTP模塊內(nèi)存

2011-09-02 14:47:48

Node

2011-11-01 10:30:36

Node.js

2011-09-09 14:23:13

Node.js

2011-09-08 13:46:14

node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2021-05-21 09:36:42

開發(fā)技能代碼

2024-01-05 08:49:15

Node.js異步編程

2020-04-15 15:48:03

Node.jsstream前端

2016-08-11 14:02:02

NodeJS前端

2021-10-23 06:42:46

Node.js 抓取堆快照.js

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2020-07-31 13:35:34

Node.js應(yīng)用分析前端
點(diǎn)贊
收藏

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

青青成人在线| 91精品国产综合久久香蕉麻豆| wwwxx欧美| 国产成人精品a视频一区| 神马香蕉久久| 欧美日韩中文字幕一区二区| 天天在线免费视频| 亚州av在线播放| 日产精品一区| 国产精品久久久久三级| 风间由美久久久| 免费一级黄色录像| 综合中文字幕| 在线精品视频小说1| 男插女免费视频| 男人天堂网在线观看| 最新国产乱人伦偷精品免费网站| 亚洲欧美中文字幕在线一区| 国产欧美精品一二三| 超碰国产一区| 亚洲综合色在线| 亚洲欧美国产精品桃花| 色一情一乱一乱一区91av| 久久精品国产亚洲a| 2020国产精品视频| 欧美黄色免费看| 日韩欧美视频在线播放| 日韩av在线免费观看| 亚洲第一成肉网| 欧美一级二级视频| 午夜国产精品影院在线观看| aa成人免费视频| 久久久久久久亚洲| 国产精品嫩模av在线| 日韩午夜激情免费电影| 天天爽人人爽夜夜爽| 国产激情在线播放| 一区二区三区视频在线看| 日韩欧美电影一区二区| 亚洲一级片免费看| 午夜一区在线| 久久久久久久久久婷婷| 亚洲xxxx3d动漫| 久久性感美女视频| 精品国产一区二区精华| 亚洲一区二区偷拍| 国产aⅴ精品一区二区四区| 欧美综合亚洲图片综合区| 91看片就是不一样| 26uuu亚洲电影| 日韩欧美成人网| 久激情内射婷内射蜜桃| 黄视频在线免费看| 一区二区三区精品视频| 日本久久高清视频| av片在线观看网站| 亚洲激情自拍偷拍| 美女av免费观看| 日本色护士高潮视频在线观看| 亚洲美女视频在线| 免费在线黄网站| 色综合成人av| 99re6这里只有精品视频在线观看| 97中文在线| 欧美一级免费片| 美女诱惑黄网站一区| 影音先锋日韩有码| 你懂得视频在线观看| 日韩免费一区| 欧美成人四级hd版| 激情五月婷婷小说| 夜夜嗨网站十八久久| 2025国产精品视频| 波多野结衣一区二区在线| 免费人成在线不卡| 91精品久久久久久久久久久久久| 国产又粗又猛又爽又黄91| 精品在线一区二区| 日韩免费视频在线观看| av片免费观看| 精品一区中文字幕| 成人在线观看网址| 日韩二区三区| 国产精品欧美综合在线| 中文字幕在线中文| 多野结衣av一区| 欧美伊人久久久久久久久影院| 天堂一区在线观看| 成人看片黄a免费看视频| 国产视频精品免费播放| 性少妇xx生活| 亚洲视频中文| 国产精品观看在线亚洲人成网| 一区二区美女视频| 不卡的av电影| 午夜精品区一区二区三| 天堂а在线中文在线无限看推荐| 韩国女主播成人在线观看| 国产精品高清一区二区三区| 日韩一二三四| 一区免费观看视频| 欧美日韩一道本| 精品美女一区| 欧洲精品在线观看| 无码国产精品久久一区免费| 亚洲伦理网站| 日韩电影中文 亚洲精品乱码| 免费成人深夜天涯网站| 好看的亚洲午夜视频在线| 国产成人一区二区三区小说| 自拍偷拍欧美亚洲| 久久精品噜噜噜成人av农村| 国产精品视频免费一区| 永久免费在线观看视频| 亚洲一区二区影院| 欧美图片激情小说| 成人免费视频观看| 亚洲精品久久久久中文字幕二区| 卡通动漫亚洲综合| 日韩精品欧美精品| 国产一区免费| 在线看三级电影| 欧美色网一区二区| 日韩人妻无码精品综合区| 韩日成人av| 51成人做爰www免费看网站| 触手亚洲一区二区三区| 精品二区三区线观看| 国产精品99精品无码视亚| 日韩片欧美片| 国产精品扒开腿做| 免费一级在线观看| 日本不卡视频在线观看| 91精品国产91久久久久久不卡| 中文字幕日韩三级| 久久久久久久久久久99999| 国产在线播放观看| 色戒汤唯在线观看| 精品电影一区二区| 青娱乐av在线| 国产一区二区免费视频| 一区二区精品国产| 99久久伊人| 在线日韩精品视频| 亚洲中文字幕无码爆乳av| 91浏览器在线视频| 国产传媒久久久| 奇米一区二区| 欧美激情18p| www.黄色国产| 亚洲一区二区av在线| 少妇欧美激情一区二区三区| 91精品综合| 亚洲一区二区三区四区在线播放| 精品自拍一区| 香蕉影视欧美成人| 国产精品果冻传媒| 1024日韩| 久久久久无码国产精品一区| 美女网站在线看| 亚洲精品国产综合区久久久久久久 | 亚洲色图欧美色| 久久精品五月| 亚洲欧洲国产日韩精品| 99视频这里有精品| 色综合导航网站| 天天干天天操av| 色婷婷av一区二区三区软件| 欧美人妻一区二区三区| 免费欧美在线视频| 看全色黄大色大片| 操欧美女人视频| 91成人国产在线观看| 第九色区av在线| 欧美浪妇xxxx高跟鞋交| 成人区人妻精品一区二| 国产情侣一区| 99精品视频在线播放观看| 欧美欧美欧美欧美| 天堂资源在线视频| 国产一区中文字幕| 黄色片网址在线观看| 香蕉视频一区| 国产欧美精品在线| 秋霞在线午夜| 亚洲免费观看高清完整| 亚洲欧美激情一区二区三区| 最新日韩在线| 亚洲欧洲精品一区| 国产精品极品在线观看| 国产精品va在线播放| 9191在线播放| 亚洲欧洲午夜一线一品| 国产男男gay网站| 岛国视频午夜一区免费在线观看| 18精品爽国产三级网站| 国产福利电影一区二区三区| 免费高清在线观看免费| 婷婷成人基地| 欧美下载看逼逼| 日本一区二区三区视频在线看| 91精品国产高清久久久久久| 日本中文在线| 日韩精品日韩在线观看| 国产欧美一区二区三区视频在线观看| 午夜久久福利影院| 欧美激情精品久久久久久免费 | 精品国产91乱码一区二区三区四区| 国产精品直播网红| 色老头在线一区二区三区| 久久成人免费视频| 国产毛片av在线| 亚洲成人激情在线观看| 一区二区三区精彩视频| 欧美性xxxxxxxxx| 欧美丰满艳妇bbwbbw| 国产欧美精品一区aⅴ影院 | 欧美激情一区二区三级高清视频| 国产精品一二三区视频| 亚洲精品一区二区三区影院 | 自拍网站在线观看| 亚洲成人久久一区| 一级视频在线播放| 日本乱码高清不卡字幕| 亚洲一区欧美在线| 亚洲精品日日夜夜| 亚洲天堂精品一区| 国产丝袜在线精品| 亚洲专区区免费| 成人国产视频在线观看| 日韩精品――色哟哟| 国内不卡的二区三区中文字幕| 男人天堂成人在线| 美女久久网站| 精品国产免费av| 国产欧美日韩综合一区在线播放 | 亚洲激情图片网| 91丨九色丨蝌蚪富婆spa| 白丝校花扒腿让我c| 国产在线观看一区二区| www.com久久久| 麻豆国产91在线播放| 欧美日韩亚洲自拍| 日韩av二区在线播放| 91av在线免费播放| 天堂一区二区在线免费观看| 日韩亚洲视频| 欧美人妖在线| 秋霞在线观看一区二区三区| 米奇777超碰欧美日韩亚洲| 久久久久久国产精品mv| 西瓜成人精品人成网站| 欧美二区在线看| 色综合中文网| 日本中文不卡| 色777狠狠狠综合伊人| 亚洲精品国产精品久久| 91综合视频| 经典三级在线视频| 欧美日韩第一区| 国产特级淫片高清视频| 国产精品一区毛片| 青青草av网站| 精品午夜久久福利影院| 精品人妻一区二区三| 成人午夜看片网址| 免费在线观看你懂的| 亚洲国产高清不卡| 国产午夜在线一区二区三区| 成人小视频免费在线观看| 国产chinese中国hdxxxx| 99久久er热在这里只有精品66| 男人网站在线观看| 久久久久久久久久看片| xxxxx99| 亚洲免费视频中文字幕| 日韩精品一区二区三| 色婷婷av一区二区三区软件| 国产精品热久久| 亚洲国产精品网站| 北岛玲日韩精品一区二区三区| 久久精品2019中文字幕| 国产嫩草在线视频| 国产成人鲁鲁免费视频a| 国产成人77亚洲精品www| 97夜夜澡人人双人人人喊| 男男gay无套免费视频欧美| 一区二区三区国产福利| 国产精品jizz在线观看美国| 无码aⅴ精品一区二区三区浪潮| 蜜臀91精品一区二区三区| 国产大尺度视频| 国产精品你懂的在线| 国产无遮挡又黄又爽在线观看| 91久久精品网| 亚洲成a人片77777精品| 国产一区二区美女视频| 日本伦理一区二区| 国产精品麻豆va在线播放| 国产伦精品一区二区三区免费优势| 日韩免费av电影| 亚洲日本免费| a在线观看免费视频| 成人av免费在线| 91香蕉一区二区三区在线观看 | 丁香六月婷婷综合| 亚洲一区二区成人在线观看| 无码人妻黑人中文字幕| 精品免费国产二区三区| 亚洲s色大片| 热久久99这里有精品| 天堂精品久久久久| 亚洲欧美日韩在线综合| 午夜亚洲视频| 国产日韩视频一区| 中文字幕亚洲在| 少妇高潮av久久久久久| 欧美黄色一级片视频| 欧美大人香蕉在线| 国产h视频在线播放| 国产一区二区三区免费观看| 国产精久久一区二区三区| 亚洲小说欧美激情另类| 国产又大又粗又长| 国产香蕉97碰碰久久人人| 51漫画成人app入口| 日韩中文字幕欧美| 少妇在线看www| 不卡视频一区二区| 婷婷亚洲综合| 免费涩涩18网站入口| 久久久99精品免费观看不卡| 国产精品久久久久久久妇| 日韩欧美国产精品一区| 91香蕉在线观看| 亚洲自拍偷拍网址| 午夜精品久久久久久久四虎美女版| 免费观看成人在线视频| 91美女福利视频| 六月丁香婷婷综合| 日韩精品免费在线| 日韩欧美精品一区二区三区| 国严精品久久久久久亚洲影视 | 精品一区二区三区中文字幕视频| 国产在线视频2019最新视频| 亚洲人成亚洲精品| 女人天堂av手机在线| 成人av动漫在线| 日韩精品人妻中文字幕| 日韩电影网在线| 亚洲美女久久精品| 明星裸体视频一区二区| 老司机午夜精品视频| 非洲一级黄色片| 在线亚洲+欧美+日本专区| 国产三级在线看| 国产美女久久精品| 91国语精品自产拍| 亚洲天堂小视频| 亚洲高清视频中文字幕| 少妇又色又爽又黄的视频| 日本sm极度另类视频| 国产亚洲一区二区三区不卡| 日本超碰在线观看| 亚洲免费在线视频| 天天操天天干天天爱| 欧洲永久精品大片ww免费漫画| 九九热精品视频在线观看| 日本免费观看网站| 日韩理论在线观看| 亚洲毛片欧洲毛片国产一品色| 国内精品久久久| 亚洲一区导航| 在线观看17c| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 久久久国产影院| 91国内精品白嫩初高生| 国内性生活视频| 国产精品欧美极品| www日本视频| 国产成人91久久精品| 欧美国产美女| 欧美熟妇精品一区二区蜜桃视频| 欧美午夜宅男影院在线观看| 天堂资源在线中文| 国产精品久久久久久久久久久久冷| 国产视频一区免费看| 极品尤物一区二区| 亚洲第一偷拍网| 福利一区视频| 色欲色香天天天综合网www| 国产欧美日韩在线观看| 精品人妻久久久久一区二区三区| 97人人做人人爱| 91久久夜色精品国产按摩| 在线免费看黄色片| 欧美日韩国产高清一区| 精品视频一二三| 亚洲影影院av| 日韩有码一区二区三区|