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

91美女福利视频| 亚洲一区二区成人| 日韩欧美精品在线视频| 免费看欧美一级片| 韩国三级在线观看久| 精品在线观看视频| 午夜精品三级视频福利| 神马久久久久久久久久久| 蜜桃精品一区二区三区| 色婷婷综合久久| 久久综合亚洲精品| 岛国在线大片| www.欧美亚洲| 91日韩在线视频| 一级片在线观看免费| 一二三区不卡| 亚洲欧美一区二区三区在线| 蜜桃福利午夜精品一区| 大桥未久在线视频| 亚洲人精品午夜| 欧美精品尤物在线| 成人毛片视频免费看| 蜜臀av性久久久久蜜臀av麻豆 | 成人激情春色网| 黄色在线观看国产| 亚洲一级高清| 久久精品国产精品| 一二三四国产精品| 亚洲桃色综合影院| 精品女同一区二区| 91日韩精品视频| 你懂得影院夜精品a| 午夜精品国产更新| 国产女教师bbwbbwbbw| 亚洲乱亚洲乱妇| 国产三区在线成人av| 好吊色欧美一区二区三区 | 99久久久久免费精品国产 | 国产精品视频分类| 免费毛片b在线观看| 一区二区在线观看免费| 伊人久久大香线蕉午夜av| 男人av在线| av午夜一区麻豆| 国产精品三区在线| 精品国产亚洲av麻豆| 久久国产精品露脸对白| 国产精品成人一区| 高潮毛片又色又爽免费| 亚洲免费影视| 人人爽久久涩噜噜噜网站| 日韩三级免费看| 在线综合亚洲| 欧美一级大片在线免费观看| 国产一区二区三区影院| 亚洲作爱视频| 欧美综合激情网| 久久精品久久久久久久| 玖玖玖国产精品| 国产成人精品日本亚洲专区61| 亚洲欧美另类在线视频| 久久一区亚洲| 国产日韩精品综合网站| 91免费视频播放| 国产精品一区二区三区四区| 亚洲一区二区三区视频| 亚洲AV无码成人片在线观看| 成人听书哪个软件好| 国产精品一区在线观看| 无码国产精品96久久久久| www国产亚洲精品久久麻豆| 欧美一级爱爱| 在线视频三区| 亚洲欧美另类图片小说| av网站大全免费| 日本不良网站在线观看| 在线精品视频免费播放| 超碰在线播放91| 久久9999免费视频| 精品91自产拍在线观看一区| 亚洲综合自拍网| 欧美综合在线视频观看| 日韩中文字幕av| 亚洲综合网在线| 激情久久久久久| 国产精彩精品视频| 四虎国产精品永久在线国在线| 国产高清成人在线| 国产伦精品一区二区三区免 | 捆绑调教一区二区三区| 亚洲在线视频福利| 色婷婷av一区二区三区之红樱桃| 91麻豆国产福利在线观看| 亚洲精品中字| 国产91足控脚交在线观看| 日韩欧美国产黄色| 亚洲色图欧美自拍| 九九精品久久| 久久99亚洲精品| 无码一区二区三区| 国产成人精品免费看| 欧美日韩天天操| 午夜小视频在线观看| 色综合久久中文字幕| 日本特黄在线观看| 亚洲欧美校园春色| 欧美成人激情图片网| 无码人妻精品一区二区三区9厂 | 男女在线视频| 91豆麻精品91久久久久久| a级大片免费看| av一区二区高清| 97热精品视频官网| 国产熟女一区二区三区五月婷 | 亚洲精品白浆高清久久久久久| 91成人精品一区二区| 国产日韩欧美一区在线| 亚洲精品欧美日韩专区| av基地在线| 一本一本大道香蕉久在线精品| 国产精品无码自拍| 91精品国产乱码久久久久久久| 欧美一性一乱一交一视频| 国产浮力第一页| 中文字幕一区不卡| 人妻丰满熟妇av无码区app| 精品国产导航| 久久久久久国产| 91免费视频播放| 中文av一区二区| 国产成人久久777777| 免费萌白酱国产一区二区三区| 大胆人体色综合| 91成人国产综合久久精品| 国产日韩精品一区二区三区在线| 黄色www网站| 韩国女主播一区二区三区| 欧美成年人在线观看| av片免费播放| 亚洲精品一二三四区| 色噜噜狠狠一区二区三区狼国成人| 国精一区二区| 国产成人久久久| 国产美女性感在线观看懂色av| 日韩欧美在线视频日韩欧美在线视频 | 亚洲国产另类久久久精品极度| 东京一区二区| 亚洲免费影视第一页| 国产又大又黄视频| 91蜜桃网址入口| 人妻内射一区二区在线视频| 五月天亚洲色图| 日产精品99久久久久久| 精品一二三区视频| 欧亚洲嫩模精品一区三区| 亚洲精品国产熟女久久久| 日韩福利视频导航| 一区二区三区四区不卡| 成人免费91| 欧美日韩ab片| 污视频网站免费观看| 欧美日韩国产在线| 精品人伦一区二区三电影| 日本中文字幕一区二区视频| 一区二区国产日产| 精品成人18| 久久久噜噜噜久久久| 色哟哟中文字幕| 色婷婷香蕉在线一区二区| 国产福利在线导航| 国产综合久久久久久久久久久久 | 国产写真视频在线观看| 日韩欧美卡一卡二| 黄色在线免费观看| 国产精品毛片高清在线完整版| 免费在线观看污网站| 韩日成人在线| 日韩国产伦理| 日韩在线成人| 日本欧美黄网站| 日本福利专区在线观看| 欧美mv日韩mv| 亚洲成熟少妇视频在线观看| 中文字幕亚洲区| 精品伦一区二区三区| 久久一二三四| 免费网站在线观看视频| 欧美精品中文| 国产日韩av在线| h片在线观看视频免费| 国产亚洲精品va在线观看| 99热在线只有精品| 欧美午夜片在线免费观看| 蜜桃av免费观看| 不卡视频在线看| 欧美精品久久久久久久久25p| 亚洲综合婷婷| 日本不卡二区高清三区| 91成人福利| 国产精品草莓在线免费观看| 日本高清成人vr专区| 亚洲人线精品午夜| 亚洲精品久久久久久久久久久久久久| 欧美日韩亚洲成人| 欧美日韩精品一区二区三区视频播放 | 亚洲视频在线免费| 日本一区免费看| 日韩欧美中文字幕在线视频| 日韩美女在线看| av资源一区| 爱福利视频一区| 黄色美女网站在线观看| 亚洲成人激情图| 91久久精品无码一区二区| 一本久久a久久精品亚洲| 国产系列精品av| 亚洲男帅同性gay1069| 欧美特级黄色录像| 99久久夜色精品国产网站| 性高潮久久久久久| 黄网站免费久久| 国产一级特黄a大片免费| 国产欧美午夜| 久久久久久免费看| 国内精品99| 九九久久九九久久| 图片小说视频色综合| 日韩精品伦理第一区| 亚洲男人都懂第一日本| 好吊妞www.84com只有这里才有精品| 久久丁香四色| 91久久精品一区| 久久三级毛片| 国产专区欧美专区| 视频精品导航| 国产精品夫妻激情| 天堂久久午夜av| 国产成人久久久精品一区| 伊人久久视频| 日韩av电影在线网| 亚洲天堂一区二区| 日本精品视频在线播放| 欧美男体视频| 国产成人精品一区二区| 写真福利精品福利在线观看| 清纯唯美亚洲综合| 成人软件在线观看| 国产精品久久久久久久久久久久久| 中文字幕 在线观看| 欧美伊久线香蕉线新在线| 亚洲女同av| 国产精品99久久久久久www| 九九热线视频只有这里最精品| 国产大片精品免费永久看nba| 日本一区二区电影| 成人日韩av在线| 日本一区二区三区中文字幕| 国产精品午夜一区二区欲梦| 视频91a欧美| 97超碰人人看人人| 欧美精品国产白浆久久久久| 欧美精品欧美精品系列c| 精品久久久久久久久久久下田| 视频在线精品一区| 91精品国产自产拍在线观看蜜| 超碰97在线看| 亚洲欧洲视频| 99草草国产熟女视频在线| 久久成人免费网| xxxx国产视频| 91在线你懂得| 亚洲成人黄色av| 亚洲免费电影在线| 中文字幕在线观看免费视频| 91久久精品网| 精品人妻无码一区二区| 亚洲护士老师的毛茸茸最新章节| 狠狠狠综合7777久夜色撩人| 精品国产一区二区三区久久狼黑人 | 亚洲中文字幕在线一区| 日韩三级精品电影久久久| 污污网站在线免费观看| 色综合伊人色综合网| 精品精品导航| 国产精品视频自在线| 色妞ww精品视频7777| 欧美激情论坛| 欧美 日韩 国产一区二区在线视频| 亚洲自偷自拍熟女另类| 久久精品二区亚洲w码| 久久精品aⅴ无码中文字字幕重口| 久久这里只有精品6| 久久国产高清视频| 欧美性猛交xxxx| 国产草草影院ccyycom| 亚洲欧美综合精品久久成人| 中文字幕在线观看网站| 日本中文字幕成人| 在线播放一区二区精品视频| 亚洲国产欧美一区二区三区不卡| 亚洲激精日韩激精欧美精品| 国产自偷自偷免费一区 | 日韩国产一区二| 无码人妻一区二区三区精品视频| 国产视频亚洲色图| 五月天婷婷综合网| 日韩欧美国产综合| h视频在线免费| 欧美亚洲在线视频| 亚洲高清999| 在线国产伦理一区| 日精品一区二区三区| 熟妇高潮一区二区| 亚洲免费在线观看| 国产精品露脸视频| 亚洲欧美在线看| 9999热视频在线观看| 91福利入口| 婷婷久久一区| 视频在线观看免费高清| 久久亚区不卡日本| 日本三级黄色大片| 精品人伦一区二区色婷婷| 成人黄视频在线观看| 国产日本欧美一区二区三区在线| 深爱激情综合| 国产偷人视频免费| 99久久久精品| 国产又大又黑又粗免费视频| 精品国产乱码久久久久久图片| 黄色免费在线看| 成人av.网址在线网站| 不卡中文字幕| 久久久久久久片| 国产欧美一区二区精品性色超碰| 91国产丝袜播放在线| 精品剧情在线观看| 四季久久免费一区二区三区四区| 成人欧美在线观看| 亚洲精品国产成人影院| 中文字幕在线视频一区二区三区| 国产精品伦一区| 在线中文字幕网站| 日韩专区在线观看| 日韩三级成人| 中文字幕制服丝袜在线| 精久久久久久久久久久| 免费成人深夜夜行网站| 91精品黄色片免费大全| a视频在线免费看| 91文字幕巨乱亚洲香蕉| 国语自产精品视频在线看8查询8| 中文字幕无码毛片免费看| 亚洲黄色性网站| 天天色综合久久| 日本欧美一级片| 青青草国产成人a∨下载安卓| 免费看污污网站| 亚洲欧美日韩综合aⅴ视频| 国产高清视频免费| 欧美激情亚洲国产| 欧美18免费视频| 日韩 欧美 高清| 中文字幕av不卡| 国产成人久久精品77777综合| 久久久久久久一区二区三区| 神马香蕉久久| 黄色一级片免费的| 亚洲伊人色欲综合网| 日韩精品系列| 国产精品永久免费视频| 综合精品久久| 欧美性xxxx图片| 欧美日韩久久一区| 欧美黑人猛交的在线视频| 精品免费日产一区一区三区免费| 日韩国产欧美在线播放| 美女福利视频在线观看| 日韩av中文字幕在线播放| 成人精品动漫| 免费高清一区二区三区| 国产蜜臀97一区二区三区| 国产激情视频在线播放| 欧美性在线视频| 午夜精品毛片| 日本aaa视频| 91精品啪在线观看国产60岁| 黄频免费在线观看| 在线无限看免费粉色视频| av在线综合网| 亚洲影视一区二区| 91高清视频在线免费观看| 97精品一区二区| 久久丫精品国产亚洲av不卡| 欧美精品三级在线观看| 一个人看的www视频在线免费观看| 影音先锋欧美在线| 91蝌蚪国产九色| 精品免费久久久| 国产精品久久久久77777|