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

Node.js 抓取堆快照過程解析

開發 前端
在 Node.js 中,我們有時候需要抓取進程堆快照來判斷是否有內存泄漏,本文介紹Node.js 中抓取堆快照的實現。

[[430591]]

前言:在 Node.js 中,我們有時候需要抓取進程堆快照來判斷是否有內存泄漏,本文介紹Node.js 中抓取堆快照的實現。

首先來看一下 Node.js 中如何抓取堆快照。

  1. const { Session } = require('inspector'); 
  2.  
  3. const session = new Session(); 
  4.  
  5. let chunk = ''
  6.  
  7. const cb = (result) => { 
  8.  
  9.   chunk += result.params.chunk; 
  10.  
  11. }; 
  12.  
  13.  
  14. session.on('HeapProfiler.addHeapSnapshotChunk', cb); 
  15. session.post('HeapProfiler.takeHeapSnapshot', (err, r) => { 
  16.   session.off('HeapProfiler.addHeapSnapshotChunk', cb); 
  17.     console.log(err || chunk); 
  18.  
  19. }); 

下面看一下 HeapProfiler.addHeapSnapshotChunk 命令的實現。

  1.       v8_crdtp::SpanFrom("takeHeapSnapshot"), 
  2.       &DomainDispatcherImpl::takeHeapSnapshot 

對應 DomainDispatcherImpl::takeHeapSnapshot 函數。

  1. void DomainDispatcherImpl::takeHeapSnapshot(const v8_crdtp::Dispatchable& dispatchable){ 
  2.     std::unique_ptr<DomainDispatcher::WeakPtr> weak = weakPtr(); 
  3.     // 抓取快照  
  4.     DispatchResponse response = m_backend->takeHeapSnapshot(std::move(params.reportProgress), std::move(params.treatGlobalObjectsAsRoots), std::move(params.captureNumericValue)); 
  5.     // 抓取完畢,響應 
  6.     if (weak->get()) 
  7.         weak->get()->sendResponse(dispatchable.CallId(), response); 
  8.     return
  9.  

上面代碼中 m_backend 是 V8HeapProfilerAgentImpl 對象。

  1. Response V8HeapProfilerAgentImpl::takeHeapSnapshot( 
  2.     Maybe<bool> reportProgress, Maybe<bool> treatGlobalObjectsAsRoots, 
  3.     Maybe<bool> captureNumericValue) { 
  4.   v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); 
  5.   // 抓取快照 
  6.   const v8::HeapSnapshot* snapshot = profiler->TakeHeapSnapshot( 
  7.       progress.get(), &resolver, treatGlobalObjectsAsRoots.fromMaybe(true), 
  8.       captureNumericValue.fromMaybe(false)); 
  9.   // 抓取完畢后通知調用方     
  10.   HeapSnapshotOutputStream stream(&m_frontend); 
  11.   snapshot->Serialize(&stream); 
  12.   const_cast<v8::HeapSnapshot*>(snapshot)->Delete(); 
  13.   // HeapProfiler.takeHeapSnapshot 命令結束,回調調用方 
  14.   return Response::Success(); 
  15.  

我們重點看一下 profiler->TakeHeapSnapshot。

  1. const HeapSnapshot* HeapProfiler::TakeHeapSnapshot( 
  2.     ActivityControl* control, ObjectNameResolver* resolver, 
  3.     bool treat_global_objects_as_roots, bool capture_numeric_value) { 
  4.   return reinterpret_cast<const HeapSnapshot*>( 
  5.       reinterpret_cast<i::HeapProfiler*>(this)->TakeSnapshot( 
  6.           control, resolver, treat_global_objects_as_roots, 
  7.           capture_numeric_value)); 
  8.  

繼續看真正的 TakeSnapshot。

  1. HeapSnapshot* HeapProfiler::TakeSnapshot( 
  2.     v8::ActivityControl* control, 
  3.     v8::HeapProfiler::ObjectNameResolver* resolver, 
  4.     bool treat_global_objects_as_roots, bool capture_numeric_value) { 
  5.   is_taking_snapshot_ = true
  6.   HeapSnapshot* result = new HeapSnapshot(this, treat_global_objects_as_roots, 
  7.                                           capture_numeric_value); 
  8.   { 
  9.     HeapSnapshotGenerator generator(result, control, resolver, heap()); 
  10.     if (!generator.GenerateSnapshot()) { 
  11.       delete result; 
  12.       result = nullptr; 
  13.     } else { 
  14.       snapshots_.emplace_back(result); 
  15.     } 
  16.   } 
  17.   return result; 
  18.  

我們看到新建了一個 HeapSnapshot 對象,然后通過 HeapSnapshotGenerator 對象的 GenerateSnapshot 抓取快照。看一下 GenerateSnapshot。

  1. bool HeapSnapshotGenerator::GenerateSnapshot() { 
  2.   Isolate* isolate = Isolate::FromHeap(heap_); 
  3.   base::Optional<HandleScope> handle_scope(base::in_place, isolate); 
  4.   v8_heap_explorer_.CollectGlobalObjectsTags(); 
  5.   // 抓取前先回收不用內存,保證看到的是存活的對象,否則影響內存泄漏的分析 
  6.   heap_->CollectAllAvailableGarbage(GarbageCollectionReason::kHeapProfiler); 
  7.   // 收集內存信息 
  8.   snapshot_->AddSyntheticRootEntries(); 
  9.   FillReferences(); 
  10.   snapshot_->FillChildren(); 
  11.   return true
  12.  

GenerateSnapshot 的邏輯是首先進行GC 回收不用的內存,然后收集 GC 后的內存信息到 HeapSnapshot 對象。接著看收集完后的邏輯。

  1. HeapSnapshotOutputStream stream(&m_frontend); 
  2. snapshot->Serialize(&stream); 

HeapSnapshotOutputStream 是用于通知調用方收集的數據(通過 m_frontend)。

  1. explicit HeapSnapshotOutputStream(protocol::HeapProfiler::Frontend* frontend) 
  2.       : m_frontend(frontend) {} 
  3.   void EndOfStream() override {} 
  4.   int GetChunkSize() override { return 102400; } 
  5.   WriteResult WriteAsciiChunk(char* data, int size) override { 
  6.     m_frontend->addHeapSnapshotChunk(String16(data, size)); 
  7.     m_frontend->flush(); 
  8.     return kContinue; 

HeapSnapshotOutputStream 通過 WriteAsciiChunk 告訴調用方收集的數據,但是目前我們還沒有數據源,下面看看數據源怎么來的。

  1. snapshot->Serialize(&stream); 

看一下 Serialize。

  1. void HeapSnapshot::Serialize(OutputStream* stream, 
  2.                              HeapSnapshot::SerializationFormat format) const { 
  3.   i::HeapSnapshotJSONSerializer serializer(ToInternal(this)); 
  4.   serializer.Serialize(stream); 
  5.  

最終調了 HeapSnapshotJSONSerializer 的 Serialize。

  1. void HeapSnapshotJSONSerializer::Serialize(v8::OutputStream* stream) { 
  2.   // 寫者 
  3.   writer_ = new OutputStreamWriter(stream); 
  4.   // 開始寫 
  5.   SerializeImpl(); 
  6.  

我們看一下 SerializeImpl。

  1. void HeapSnapshotJSONSerializer::SerializeImpl() { 
  2.   DCHECK_EQ(0, snapshot_->root()->index()); 
  3.   writer_->AddCharacter('{'); 
  4.   writer_->AddString("\"snapshot\":{"); 
  5.   SerializeSnapshot(); 
  6.   if (writer_->aborted()) return
  7.   writer_->AddString("},\n"); 
  8.   writer_->AddString("\"nodes\":["); 
  9.   SerializeNodes(); 
  10.   if (writer_->aborted()) return
  11.   writer_->AddString("],\n"); 
  12.   writer_->AddString("\"edges\":["); 
  13.   SerializeEdges(); 
  14.   if (writer_->aborted()) return
  15.   writer_->AddString("],\n"); 
  16.  
  17.   writer_->AddString("\"trace_function_infos\":["); 
  18.   SerializeTraceNodeInfos(); 
  19.   if (writer_->aborted()) return
  20.   writer_->AddString("],\n"); 
  21.   writer_->AddString("\"trace_tree\":["); 
  22.   SerializeTraceTree(); 
  23.   if (writer_->aborted()) return
  24.   writer_->AddString("],\n"); 
  25.  
  26.   writer_->AddString("\"samples\":["); 
  27.   SerializeSamples(); 
  28.   if (writer_->aborted()) return
  29.   writer_->AddString("],\n"); 
  30.  
  31.   writer_->AddString("\"locations\":["); 
  32.   SerializeLocations(); 
  33.   if (writer_->aborted()) return
  34.   writer_->AddString("],\n"); 
  35.  
  36.   writer_->AddString("\"strings\":["); 
  37.   SerializeStrings(); 
  38.   if (writer_->aborted()) return
  39.   writer_->AddCharacter(']'); 
  40.   writer_->AddCharacter('}'); 
  41.   writer_->Finalize(); 
  42.  

SerializeImpl 函數的邏輯就是把快照數據通過 OutputStreamWriter 對象 writer_ 寫到 writer_ 持有的 stream 中。寫的數據有很多種類型,這里以 AddCharacter 為例。

  1. void AddCharacter(char c) { 
  2.   chunk_[chunk_pos_++] = c; 
  3.   MaybeWriteChunk(); 
  4.  

每次寫的時候都會判斷是不達到閾值,是的話則先推給調用方。看一下 MaybeWriteChunk。

  1. void MaybeWriteChunk() { 
  2.   if (chunk_pos_ == chunk_size_) { 
  3.     WriteChunk(); 
  4.   } 
  5.  
  6.  
  7.  
  8.  
  9. void WriteChunk() { 
  10.  
  11.   // stream 控制是否還需要寫入,通過 kAbort 和 kContinue 
  12.   if (stream_->WriteAsciiChunk(chunk_.begin(), chunk_pos_) == 
  13.       v8::OutputStream::kAbort) 
  14.     aborted_ = true
  15.   chunk_pos_ = 0; 
  16.  

我們看到最終通過 stream 的 WriteAsciiChunk 寫到 stream 中。

  1. WriteResult WriteAsciiChunk(char* data, int size) override { 
  2.   m_frontend->addHeapSnapshotChunk(String16(data, size)); 
  3.   m_frontend->flush(); 
  4.   return kContinue; 
  5.  

WriteAsciiChunk 調用 addHeapSnapshotChunk 通知調用方。

  1. void Frontend::addHeapSnapshotChunk(const String& chunk){ 
  2.     v8_crdtp::ObjectSerializer serializer; 
  3.     serializer.AddField(v8_crdtp::MakeSpan("chunk"), chunk); 
  4.     frontend_channel_->SendProtocolNotification(v8_crdtp::CreateNotification("HeapProfiler.addHeapSnapshotChunk", serializer.Finish())); 
  5.  

觸發 HeapProfiler.addHeapSnapshotChunk 事件,并傳入快照的數據,最終觸發 JS 層的事件。再看一下文章開頭的代碼。

  1. let chunk = ''
  2.  
  3. const cb = (result) => { 
  4.  
  5.   chunk += result.params.chunk; 
  6.  
  7. }; 
  8.  
  9.  
  10.  
  11. session.on('HeapProfiler.addHeapSnapshotChunk', cb); 
  12. session.post('HeapProfiler.takeHeapSnapshot', (err, r) => { 
  13.   session.off('HeapProfiler.addHeapSnapshotChunk', cb); 
  14.     console.log(err || chunk); 
  15.  
  16. }); 

這個過程是否清晰了很多。從過程中也看到,抓取快照雖然傳入了回調,但是其實是以同步的方式執行的,因為提交 HeapProfiler.takeHeapSnapshot 命令后,V8 就開始收集內存,然后不斷觸發

HeapProfiler.addHeapSnapshotChunk 事件,直到堆數據寫完,然后執行 JS 回調。

總結:整個過程不算復雜,因為我們沒有涉及到堆內存管理那部分,V8 Inspector 提供了很多命令,有時間的話后續再分析其他的命令。

 

責任編輯:姜華 來源: 編程雜技
相關推薦

2025-01-13 00:00:00

2022-04-01 08:02:32

Node.js快照加速hooks

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2021-10-03 15:02:50

HTTPNodejs

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2020-05-29 15:33:28

Node.js框架JavaScript

2025-03-10 00:00:22

PDF圖片表格

2015-06-23 15:27:53

HproseNode.js

2012-02-03 09:25:39

Node.js

2024-07-08 08:53:52

2021-02-01 15:42:45

Node.jsSQL應用程序

2021-04-06 10:15:29

Node.jsHooks前端

2020-10-26 08:34:13

Node.jsCORS前端
點贊
收藏

51CTO技術棧公眾號

国产艳妇疯狂做爰视频 | 公共露出暴露狂另类av| 国产乱码精品一区二三区蜜臂| 自产国语精品视频| 日韩久久午夜影院| 亚洲欧美aaa| 黄色视屏在线免费观看| 日本一区二区三区久久久久久久久不 | 狠狠色2019综合网| 全亚洲最色的网站在线观看| 国产黄色录像片| 青青草久久爱| 欧美一级xxx| 国产免费视频传媒| 伦理av在线| 国产精品麻豆久久久| 精品乱色一区二区中文字幕| 亚洲综合网av| 亚洲欧美日韩在线观看a三区| 日韩中文字幕在线免费观看| 亚洲乱码国产乱码精品精大量| 91视频亚洲| 91久久人澡人人添人人爽欧美| 波多野结衣与黑人| 日本中文字幕在线看| 91亚洲精品一区二区乱码| 亚洲www在线观看| 中文字幕在线2019| 久久在线91| 91精品国产91久久久| 中文字幕在线有码| 日韩一级毛片| 中文字幕欧美视频在线| 黄瓜视频污在线观看| 超碰在线亚洲| 日韩精品一区国产麻豆| 国产日韩欧美久久| 日韩中文视频| 在线亚洲高清视频| 37pao成人国产永久免费视频| 欧美人与禽猛交乱配| 亚洲欧美偷拍三级| a级黄色片网站| 亚洲成a人v欧美综合天堂麻豆| 99精品热视频| 久久精彩视频| 亚洲av无码乱码国产精品久久| 久久99这里只有精品| 国产精品久久久久久五月尺| 国产精品自拍99| 亚洲国产专区校园欧美| 午夜激情久久久| 黄色录像特级片| av在线播放观看| 亚洲激情成人在线| www.69av| 草草视频在线观看| 一本色道a无线码一区v| 国产淫片av片久久久久久| 欧美18av| 欧美伊人久久久久久午夜久久久久| 无码人妻精品一区二区三区66| 欧美性理论片在线观看片免费| 欧美三级三级三级| 青青草久久伊人| 日韩高清一区| 亚洲国产精品成人一区二区| 欧美无人区码suv| 国产一区二区三区站长工具| 中文字幕av一区二区| 一区二区国产精品精华液| 欧美极品一区二区三区| 97精品国产97久久久久久春色| 成人精品免费在线观看| 日本午夜精品视频在线观看| 成人亚洲激情网| 免费av一级片| 久久久久久久电影| 91精品国产高清久久久久久91裸体| 国产美女免费视频| 成人a区在线观看| 欧美精品欧美精品系列c| 99精品在线视频观看| 成熟亚洲日本毛茸茸凸凹| 精品一区久久久久久| a天堂在线资源| 亚洲精品视频免费观看| 欧美丰满熟妇bbbbbb百度| 国产综合av| 日韩三级视频在线看| 中文字幕乱码在线| 久久视频国产| 午夜精品久久久久久久99热浪潮| 九九热最新视频| 国产成a人亚洲精品| 欧美午夜免费| 欧美极品少妇videossex| 色综合久久久久网| 免费观看黄网站| 天天躁日日躁狠狠躁欧美巨大小说 | 伊人五月天婷婷| 女厕嘘嘘一区二区在线播放| 欧美大码xxxx| 亚洲国产无线乱码在线观看| jvid福利写真一区二区三区| 亚洲小说欧美另类激情| 成人在线爆射| 亚洲国产精彩中文乱码av| 国产成人免费在线观看视频| 9色精品在线| 91亚洲国产成人精品性色| 美女欧美视频在线观看免费 | 久久久精品2019中文字幕之3| 99re6这里有精品热视频| 日韩一区二区三区免费| 亚洲国产精品免费| 紧身裙女教师波多野结衣| 日韩国产精品久久久| 国产丝袜不卡| 羞羞视频在线观看免费| 精品视频一区二区不卡| 亚洲第一成人网站 | 一区二区在线播放视频| 国产精品网站在线看| 久久综合伊人77777尤物| 91丨九色丨海角社区| 91在线视频免费观看| 人人妻人人澡人人爽欧美一区双| 日韩成人在线电影| 在线观看国产91| 亚洲最大免费视频| 18成人免费观看视频| 97国产超碰| 国产在线1区| 欧美精品乱码久久久久久按摩| 中文字幕 自拍| 久热国产精品| 人禽交欧美网站免费| 美脚恋feet久草欧美| 国产丝袜一区二区三区| 国产精品100| eeuss鲁片一区二区三区在线观看| 大桥未久一区二区三区| crdy在线观看欧美| 理论片在线不卡免费观看| 97人妻精品一区二区三区软件| 国产精品久久一卡二卡| 15—17女人毛片| 国产精品99久久| 亚洲一区二区免费| 性爱视频在线播放| 精品免费国产二区三区| 日韩免费av片| 337p粉嫩大胆噜噜噜噜噜91av| 91猫先生在线| 国产欧美日韩精品高清二区综合区| 热草久综合在线| 国产高清在线看| 在线电影国产精品| 国产一级生活片| 99精品国产视频| 国产精品少妇在线视频| 日韩欧美一区二区三区在线视频| 国产日产欧美精品| 四虎影院观看视频在线观看| 精品国产伦理网| 天码人妻一区二区三区在线看| 久久久精品人体av艺术| 在线观看国产中文字幕| 中文字幕午夜精品一区二区三区| 成人黄色在线免费观看| 悠悠资源网亚洲青| 色狠狠久久aa北条麻妃| www.日本在线观看| 福利微拍一区二区| 成人18视频免费69| 成人成人成人在线视频| 欧美自拍小视频| 欧美成人亚洲| 奇米视频888战线精品播放| 久久青草视频| 国内久久久精品| 国产黄在线看| 欧美变态tickle挠乳网站| 丁香六月婷婷综合| 日韩一区欧美小说| 91超薄肉色丝袜交足高跟凉鞋| 狂野欧美一区| 激情六月天婷婷| 国产一区二区三区四区| 亚洲xxxx在线| 国产经典一区| 久久久久久久一区二区| 国产爆初菊在线观看免费视频网站| 欧美一区二区日韩一区二区| 亚洲欧美精品一区二区三区| 亚洲欧美激情在线| 欧美特级黄色录像| 岛国av在线一区| 在线观看免费不卡av| 99精品视频免费全部在线| 国产系列第一页| 免费成人av| 国产成人免费电影| 日本成人一区二区| 欧美综合第一页| 久久亚洲资源| 久久天天躁狠狠躁夜夜爽蜜月| 四虎影视在线观看2413| 日韩欧美在线不卡| 中文字字幕在线观看| 黄色一区二区三区| 久久免费看少妇高潮v片特黄 | 永久免费未视频| 久久久久久**毛片大全| 五月天丁香社区| 国产一区二区三区在线观看免费视频| 国产免费成人在线| 在线不卡欧美| 樱空桃在线播放| 日韩精品一区二区三区免费观看| 久久久久久久久久久一区| 伊人久久噜噜噜躁狠狠躁| 91精品久久久久久久久青青| 欧美va在线| 日本国产一区二区三区| 77thz桃花论族在线观看| 欧美极品少妇全裸体| 最爽无遮挡行房视频在线| 久久在线免费观看视频| 欧美高清视频| 日韩中文字幕国产| 在线观看a视频| 中文字幕日韩av综合精品| 国产一级在线| 国产亚洲人成a一在线v站| 蜜桃成人在线视频| 国产亚洲一级高清| 免费资源在线观看| 亚洲欧美在线一区二区| 久久电影视频| 正在播放欧美视频| 91社区在线观看播放| 色黄久久久久久| 色综合久久影院| 久久激情视频免费观看| 免费a级人成a大片在线观看| 精品国产欧美成人夜夜嗨| 国产日产一区二区| 欧美另类在线观看| segui88久久综合| 性欧美xxxx交| 国产精品专区免费| 国产精品久久久久秋霞鲁丝 | 欧美精品在欧美一区二区少妇| 一区二区三区播放| 欧美一区二区啪啪| 高潮毛片7777777毛片| 亚洲精品在线观| 免费在线视频一级不卡| 一区国产精品视频| 国产原创视频在线观看| 久久人人爽人人爽人人片av高请 | 国产日韩亚洲欧美精品| 欧美 日韩精品| 麻豆精品视频在线| 天天爽夜夜爽视频| 北岛玲一区二区三区四区| 五级黄高潮片90分钟视频| 亚洲国产精品激情在线观看| 欧美特黄一级片| 亚洲国产色一区| 日韩 国产 欧美| 欧美精品视频www在线观看| 亚洲成人av综合| 亚洲色图综合网| 黄网站在线免费看| 午夜美女久久久久爽久久| 日本不卡一二三| 亚洲已满18点击进入在线看片| 精品三级av在线导航| 日韩欧美亚洲日产国产| 欧美成人tv| 成人免费观看毛片| 国产一区二区三区在线观看精品 | 亚洲国产精品久久不卡毛片| aaa在线视频| 555夜色666亚洲国产免| 色香蕉在线视频| 日韩在线视频一区| 一个人www视频在线免费观看| 成人黄色生活片| 婷婷综合福利| 日本大胆人体视频| 欧美96一区二区免费视频| 国产伦精品一区三区精东| 中文字幕一区二区三区在线播放 | 日韩av网站免费在线| 动漫美女无遮挡免费| 国产欧美1区2区3区| 日韩女优在线观看| 欧美一区日本一区韩国一区| 国际av在线| 久久久久久久久久婷婷| 亚洲精品无播放器在线播放| 欧美二级三级| 亚洲黄色大片| 天天爽夜夜爽视频| 中文字幕一区二区在线观看| 91精品国产高清一区二区三密臀| 欧美一区二区黄| 日本中文字幕在线2020| 欧美一级在线亚洲天堂| aaa国产精品视频| 人人妻人人澡人人爽精品欧美一区| 久久精品官网| 亚洲av无码一区二区三区网址 | 国产情侣呻吟对白高潮| 日韩电视剧免费观看网站| 日皮视频在线观看| 2020国产精品久久精品不卡| 希岛爱理一区二区三区| 99热一区二区| 国产女同互慰高潮91漫画| 国产又黄又猛又粗又爽| 日韩av中文字幕在线免费观看| a级片在线免费| 99久久综合狠狠综合久久止| 亚洲一本二本| 捷克做爰xxxⅹ性视频| 国产精品麻豆一区二区| 中国女人真人一级毛片| 亚洲最新av在线| 成人亚洲免费| 一区不卡视频| 老司机精品视频在线| 国产调教在线观看| 国产精品美日韩| 国产男人搡女人免费视频| 亚洲视频在线观看网站| 美女100%一区| 香蕉久久免费影视| 日本 国产 欧美色综合| 污污视频网站在线免费观看| 欧美色爱综合网| 精品麻豆一区二区三区| 91精品久久久久久久久| 亚洲综合五月| 国产人妖在线观看| 亚洲国产精品尤物yw在线观看| 日本免费一区视频| 欧美一区深夜视频| 精品一区二区三区在线| 91国内在线播放| 一区二区三区日本| 四虎免费在线观看| 97香蕉超级碰碰久久免费的优势| 日韩欧美国产大片| www.超碰com| 亚洲天堂久久久久久久| 亚洲精品911| 91精品国产91久久久久久不卡| 伊人精品一区| 中文字幕在线综合| 亚洲激情在线播放| 天天操天天干天天舔| 国产精品免费福利| 在线观看日韩| 真人bbbbbbbbb毛片| 欧美色图一区二区三区| 国产福利视频在线观看| 精品国产综合| 麻豆传媒一区二区三区| 欧美成人精品欧美一级| 日韩国产欧美精品一区二区三区| 精品成人av| 国产在线视频在线| 久久免费看少妇高潮| 97人人爽人人爽人人爽| 欧美激情中文网| 欧美日韩性在线观看| 久久久精品人妻一区二区三区| 疯狂做受xxxx欧美肥白少妇| 欧美激情办公室videoshd| 国产一区二区三区色淫影院| 日本麻豆一区二区三区视频| 青娱乐在线视频免费观看| 亚洲天堂av网| **爰片久久毛片| 91高清国产视频| 欧美性猛交xxxx乱大交极品| 国产精品久久久久久福利| 久久综合久久综合这里只有精品| 九色|91porny| 欧美一级片免费在线观看| 久久av中文字幕| 精品久久影视| 欧美无人区码suv| 日韩欧美二区三区| 欧美xxxx性|