亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網運營的一線實戰(zhàn)洞察。

JavaScript內存管理:棧堆分配、垃圾回收與內存泄漏排查

JavaScript內存管理:棧堆分配、垃圾回收與內存泄漏排查 1. 內存管理為什么JS開發(fā)者總得懂點這個如果你寫JavaScript寫過一陣子大概率聽過垃圾回收內存泄漏這些詞但真被問到JS里的內存管理到底是怎么工作的很多人會卡殼。這不奇怪因為JS這門語言替你扛了絕大部分內存相關的臟活累活——你聲明一個變量、調一個函數、new一個對象背后都有引擎在默默分配和回收內存。你不需要像C/C那樣手動malloc和free但也正因為不用管一旦出了問題頁面越用越卡、內存爆掉、進程被殺反而不知道從哪查起。這篇文章就把JS內存管理這塊從頭到尾拆開來講變量聲明時內存怎么分配、對象和閉包在堆里怎么存活、垃圾回收的標記-清除到底怎么運作、什么場景最容易制造內存泄漏以及排查泄漏時該看哪些指標。不管你是剛入門前端的新手還是被線上性能問題折磨過的老手這篇文章都能給你一個能落地的認知框架和排查思路。需要說明的是我這里講的以V8引擎也就是Chrome和Node.js使用的引擎為主因為它是目前最主流、資料也最全的實現。其他引擎如JavaScriptCore、SpiderMonkey的機制大同小異核心思路一致細節(jié)略有差異。先說一個最基礎的結論JS的內存管理核心就是自動分配、垃圾回收、手動兜底這三個詞。自動分配由引擎完成垃圾回收也是引擎的周期任務但手動兜底這件事比如排查泄漏、優(yōu)化大對象、避免閉包意外存活是需要開發(fā)者自己做的。這也是為什么我說懂原理不等于會寫代碼而是出問題時知道去哪找答案。在往下讀之前先建立兩個概念JS運行時把內存分成了棧Stack和堆Heap兩大區(qū)域。棧上存放的是基本類型的值和引用類型變量的地址指針特點是分配快、自動回收堆上存放的是對象、數組、函數等引用類型的數據本體特點是空間大、生命周期不固定是垃圾回收的主要戰(zhàn)場。2. 棧與堆JS數據存放的兩大陣營2.1 棧內存輕量、快速、函數級生命周期棧是函數執(zhí)行時的臨時工作臺。每調用一次函數引擎就會在棧頂壓入一個棧幀Stack Frame這個棧幀里存放著函數的參數、函數體內聲明的局部變量、以及當前函數的返回地址。函數執(zhí)行完畢整個棧幀直接彈出里面的數據隨之釋放。這個過程極其高效因為它只涉及棧頂指針的移動不涉及內存塊的掃描和整理。棧上存儲的數據類型非常明確——基本類型Primitive Types。在JS里基本類型包括string、number、boolean、null、undefined、symbol、bigint。這些類型的數據大小固定數字8字節(jié)布爾1字節(jié)字符串雖然變化但V8里有專門的字符串表示和優(yōu)化策略引擎可以直接把它們壓在棧上。有一點容易混淆聲明一個字符串變量棧上存的是字符串的引用還是字符串本身答案取決于引擎實現和字符串的大小。V8對短字符串我記得是13個字符以內具體閾值隨版本略有差異會直接內聯在棧上這叫內聯短字符串長字符串則被放到堆上棧上只保留指針。這屬于實現細節(jié)但可以解釋一個現象——為什么大量拼接長字符串會導致內存壓力那是在堆上不斷創(chuàng)建新字符串對象。再強調一遍棧上的內存不需要你操心函數一退出就沒了。真正需要你警惕的是函數退出了但某些數據還被別處引用著——這就是閉包和全局變量的場景它們會讓本該釋放的數據繼續(xù)存活。2.2 堆內存大塊頭、長壽命、GC的主戰(zhàn)場堆是JS里所有對象、數組、函數實例的家。當你在代碼里寫const obj { name: Tom }時棧上的obj變量只保存了一個指向堆內存的地址堆上才真正存放{ name: Tom }這個對象。堆內存的特點是空間大、可以動態(tài)擴容、生命周期由引用關系決定——只要還有地方引用它它就活著沒有任何引用了它就成了垃圾等待GC回收。這引出了JS內存管理最核心的問題引擎怎么判斷這個對象沒有引用了早期的老牌引擎用引用計數Reference Counting每個對象記錄自己被引用的次數次數歸零就回收。這方案有致命的循環(huán)引用問題——A引用B、B引用A外部沒人用它們了但互相的引用計數不為0永遠無法回收。后來主流的GC算法統(tǒng)一轉向了可達性分析也就是從根Root出發(fā)遍歷所有可達的對象不可達的就是垃圾。堆里再細分V8還把它分成了新生代New Space和老生代Old Space兩片區(qū)域。新生代是年輕對象的領地空間小典型配置幾百KB到幾MB垃圾回收特別頻繁老生代是高齡對象的地盤空間大可以到幾GB甚至更多垃圾回收不頻繁但一旦執(zhí)行就很耗時。這個分代設計完全是從性能出發(fā)的——絕大多數對象的壽命都很短頻繁清理新生代既能保證內存可用又不會讓整個程序長時間停頓。2.3 一個例子看懂數據流轉舉個例子你用Vue或者React寫一個組件組件的data或state是一個對象function createTaskList() { const tasks new Array(1000).fill(null).map((_, i) ({ id: i, title: 任務 i, done: i % 2 0 })); return function getTasks() { return tasks; }; } const getTasks createTaskList(); const currentTasks getTasks();這個流程里發(fā)生的事情createTaskList執(zhí)行時函數棧幀壓棧tasks數組被創(chuàng)建在新生代堆上。函數返回了一個閉包getTasks閉包捕獲了tasks的引用。棧幀雖然彈出了但tasks數組因為閉包還在引用它沒有被回收從新生代晉升到老生代。currentTasks拿到數組引用后即使getTasks之后不再調用只要currentTasks還活著tasks數組就一直存在。這三種狀態(tài)的切換就是堆內存管理的日常tasks初始在新生代、經歷晉升到老生代、最終生命周期由引用方決定。很多人寫閉包時沒意識到閉包會讓內部變量長期存活看到這里應該能理解背后的原理了。3. 垃圾回收的核心機制標記-清除與分代回收3.1 從根開始的可達性分析現代JS引擎的GC核心思路都是標記-清除Mark-Sweep的變體。什么叫從根開始根Root是GC遍歷的起點通常包含全局對象瀏覽器里的window、Node里的global、當前執(zhí)行上下文中的局部變量和參數、調用棧上的所有引用。GC周期性執(zhí)行時從這些根出發(fā)沿著引用關系遍歷所有能觸達的對象能觸達的標記為存活觸達不到的就是垃圾等待清除。這個設計非常巧妙它不關心這個對象被引用了幾次只看從根出發(fā)走不走得到你。循環(huán)引用的問題迎刃而解——A和B互相引用但外部沒有路徑可達它們那它們就是垃圾整個引用環(huán)被一起回收。這也是為什么現代JS不用引用計數作為主方案。標記-清除有兩個衍生的優(yōu)化版本標記-復制Mark-Compact也叫Scavenge和標記-整理Mark-Compact部分實現會做整理。標記-復制是把存活對象復制到另一塊區(qū)域原區(qū)域整個清空優(yōu)點是快、適合大量死亡對象的場景標記-整理是在標記后把存活對象往一段挪動壓縮碎片適合老生代這種大空間場景。V8的老生代GCFull GC用的就是標記整理清除的組合。3.2 新生代的Scavenge機制V8把新生代分成兩個半區(qū)Semi-SpaceFrom空間和To空間。新對象被分配在From空間當From空間快滿時觸發(fā)Scavenge垃圾回收從根出發(fā)標記From空間里的存活對象。把存活對象復制到To空間同時為每個對象調整年齡經歷一次GC的對象年齡1。清空From空間的所有對象然后互換From和To的角色。這個流程對絕大多數對象活不過一次GC的場景極其高效——大部分新對象在第一次GC時就被清掉了存活下來的才晉升到老生代。晉升條件有兩個一是對象經歷了一次Scavenge仍然存活V8通常要求2次視版本而定二是To空間的占用率超過一定閾值比如25%為了給新對象留空間會提前把存活對象推向老生代。Scavenge的缺點很明顯空間利用率低一半空閑所以新生代被設計得很小。V8默認新生代最大約16MB到64MB取決于堆大小和架構。這個容量限制是有意為之——Scavenge目標就是少量復制高頻回收用空間換時間。3.3 老生代的標記-清除與整理對象晉升到老生代后GC策略就完全變了。老生代空間大、對象壽命長如果還像新生代那樣復制存活對象成本會高到難以接受。所以老生代走的是標記-清除標記-整理標記階段從根出發(fā)遍歷整個圖標記所有可達對象。清除階段遍歷堆回收所有未標記對象的內存把它們釋放回空閑列表Free List。整理階段在需要時執(zhí)行——把存活對象向堆的一端移動騰出連續(xù)的大塊空閑空間。整理能解決碎片化問題但移動對象意味著所有引用地址都要更新開銷很大所以V8只在空間碎片化嚴重或分配大對象失敗時才觸發(fā)整理。這里有個值得注意的細節(jié)老生代GCFull GC會暫停JS執(zhí)行。因為GC期間要移動對象、更新引用如果JS線程同時在讀寫對象狀態(tài)就會錯亂。V8的解決思路是增量標記Incremental Marking和并發(fā)標記Concurrent Marking——把標記階段拆成多個小步穿插在JS執(zhí)行的間隙里跑減少單次停頓時間清除階段甚至可以在后臺線程并發(fā)執(zhí)行。這就是你在DevTools Performance面板里看到的長GC任務Long Task的實際形態(tài)。說個直觀數據新生代Scavenge通常耗時零點幾毫秒到幾毫秒老生代Full GC在小頁面幾十MB堆也可能停留幾十毫秒大堆GB級別可能數百毫秒。所以框架層有個約定俗成的優(yōu)化思路——盡量減少長生命周期的大對象數量避免頻繁觸發(fā)Full GC。3.4 GC觸發(fā)時機與可觀測性GC并不是固定時間間隔運行的它的觸發(fā)時機主要看內存壓力新生代空間使用率超過閾值約70%~80%時觸發(fā)Scavenge。老生代空間使用率達到增長率閾值時觸發(fā)Full GC。系統(tǒng)內存壓力大比如設備內存告急時引擎可能提前觸發(fā)GC。顯式調用global.gc()Node.js里需要加--expose-gc參數強制GC。在瀏覽器里你可以用Performance面板錄制一段交互過程看內存曲線和GC長任務在Node.js里可以用--trace-gc參數打印GC日志觀察每次GC的堆大小、存活對象數和耗時。這些是后面排查問題時最基礎的觀測手段。4. 閉包、作用域和事件循環(huán)內存泄漏的高發(fā)區(qū)4.1 閉包是如何永久保存變量的閉包是JS最常用的特性之一也是內存泄漏最常見的源頭之一。原理很簡單一個函數返回后它的局部變量本應銷毀但如果這個函數內部創(chuàng)建了另一個函數并且那個函數引用了外層變量外層變量就被捕獲了。只要內層函數還有引用比如被存到了全局變量或事件回調里外層變量就一直活著。function createCounter() { let count 0; return { increment: () count, getCount: () count }; } const counter createCounter(); counter.increment();這里的counter對象被全局變量持有它的increment和getCount兩個方法閉包捕獲了count。只要counter不被置空count就會一直在內存里。這不是泄漏是預期行為。真正的問題在什么時候出現當你只需要用一次某個閉包卻忘了把持有它的引用置空或者不小心把它放進了某個全局數組、某個長期存在的事件監(jiān)聽器里這個變量就變成了意外的常駐內存。一個我踩過坑的案例在某個管理后臺里給每個DOM節(jié)點綁定了click事件的回調回調里又引用了一個超大配置對象。DOM節(jié)點被移除后事件監(jiān)聽卻沒有被解綁配置對象和整個閉包鏈一直被內存持有。頁面開了幾十個標簽頁后內存曲線肉眼可見地往上走。排查時用了一個笨但有效的方法Memory面板里做兩次Heap Snapshot對比過濾出Detached DOM節(jié)點再查看這些節(jié)點被誰引用——果然事件監(jiān)聽器是元兇。4.2 全局變量與隱式全局全局變量是常駐內存大戶因為它們從根出發(fā)直接可達除非顯式設為null或undefined否則永遠不會被GC回收。很多人忽略的是隱式全局變量——未聲明的變量直接被賦值嚴格模式下會報錯非嚴格模式下會掛到全局對象上。function process() { // 忘了寫 let / const / var result fetchSomeData(); // 隱式全局掛在 globalThis 上 }這個result變量不僅污染了全局命名空間還會讓fetchSomeData()的返回值一直留在堆里。代碼很難查——你在函數體里掃一遍根本看不出它被聲明在哪兒而它實際活在全局作用域。排查這類問題的一個技巧在代碼里開啟嚴格模式use strict或者直接用ESLint的no-undef規(guī)則能把隱式全局直接攔下來。另外全局緩存Global Cache也是需要注意的。為了性能很多人會把數據緩存在全局Map里const cache new Map(); function getData(key) { if (cache.has(key)) return cache.get(key); const data fetchData(key); cache.set(key, data); return data; }這個模式本身沒問題但如果你不清除緩存條目Map里的數據會一直存活。特別是當key或value是大型對象時無限制的全局緩存就是慢性內存泄漏。解決思路是給緩存加容量上限或過期時間LRU、TTLNode生態(tài)里lru-cache這類庫就是為這個場景準備的。4.3 事件監(jiān)聽器綁定一時爽解綁火葬場瀏覽器的DOM事件、Node.js的EventEmitter事件都是閉包引用鏈的常駐入口。每次addEventListener或on(click, handler)都會在事件源上建立一個從全局可達對象事件源到回調函數的引用鏈。如果不做對應清理回調函數以及它閉包里的所有數據都會一直被持有。舉一個非常常見的React隱患在useEffect里給某個全局事件源比如window綁定監(jiān)聽器但cleanup函數沒有正確解綁。useEffect(() { window.addEventListener(resize, handleResize); // 忘記 return () window.removeEventListener(resize, handleResize); }, []);組件卸載后handleResize仍然被window引用如果handleResize閉包捕獲了組件的state或props組件實例就沒辦法被GC回收造成組件卸載但數據殘留的詭異bug。這類問題在React DevTools的Highlight Updates不明顯但堆快照里能看得清清楚楚——搜索組件名你會發(fā)現已卸載的組件實例還在堆里躺著。最麻煩的是重復綁定。每次組件掛載都綁一個新監(jiān)聽器卸載時又忘了解綁累積下來監(jiān)聽器數量翻倍增長內存和性能雙雙受害。一個自查小技巧在代碼里用一個計數器統(tǒng)計某個事件源的監(jiān)聽器數量如果只掛載一個組件卻出現多個監(jiān)聽器那基本就是重復綁定未解綁。4.4 定時器與網絡請求的余孽setInterval是內存泄漏的經典制造機。它的問題是只要定時器沒有被clearInterval回調函數就會被持續(xù)執(zhí)行回調閉包引用的數據就永遠活著。排查時看到的現象是頁面長時間運行內存一點點上升不知道是哪里的數據在增長——很可能就是一個沒人清理的setInterval在周期性分配新對象。Node.js里還有個容易忽略的場景Promise或回調里的定時器如果Promise成功提前返回而定時器沒清回調仍然會在未來執(zhí)行引用鏈不會斷。更好的做法是使用AbortController或定時器ID的統(tǒng)一管理或者在工具函數層面做封裝確保定時器和請求都能在合適的時機被清理。網絡請求fetch、XHR、WebSocket也一樣。一個掛起的請求、一個沒關閉的WebSocket連接都可能持有大量的緩沖區(qū)數據。特別是請求返回的數據量很大比如日志、大JSON響應體被閉包引用后這塊內存會一直留著。設計請求層的時候最好把響應處理邏輯限制在最小的作用域內避免把大數據對象掛在全局或長期對象上。4.5 不會再被使用的引用顯式置空一個老生常談但值得強調的建議當你確定某個對象不會再被使用把它顯式設為null或undefined。這不是JS GC的必須操作GC會自動判斷可達性但它能提前斷開引用鏈讓GC在下一輪就能回收而不是等外層容器被清理。尤其在下面幾種場景里格外有用大數組或大數據對象用完后置空數組變量。從緩存Map中刪除不再需要的條目。事件監(jiān)聽器解綁后把回調引用置空。單例或多例實例不再使用時置空對實例的引用。實踐中的一個好處是置空引用能顯著降低GC壓力因為GC標記階段需要遍歷的對象更少RAM峰值更低。不過也別過度使用——頻繁手動置空會增加代碼噪音影響可讀性。折中方案是如果數據量很大且沖突明顯就值得置空否則保持代碼自然。5. 內存泄漏排查實操從現象到定位5.1 現象觀察卡頓、內存攀升、GC頻繁內存泄漏最典型的現象是越用越卡——頁面打開時流暢操作半小時后明顯卡頓甚至瀏覽器標簽頁崩潰。在Chrome任務管理器ShiftEsc里你可以直接看到每個標簽頁的內存占用和觸控進程的CPU占用。內存占用持續(xù)增長、不回落基本就要往泄漏方向查了。我建議的第一步是記錄內存基線。打開頁面后立即記錄當前內存值然后做一系列常規(guī)操作切換路由、打開關閉彈窗、增刪列表項操作完再記錄。如果每次操作的峰值比上次高、回落后也不回到基線那就是存在泄漏。這個操作前后對比的思路比單純看絕對內存值靠譜得多 — 絕對內存高可能是緩存策略正常的表現但不回落大概率是泄漏。5.2 用Performance面板定位GC長任務Chrome DevTools的Performance面板錄制一段交互過程然后查看內存曲線和時間軸上的GC任務。重點關注內存曲線是否呈階梯狀持續(xù)上升而不是周期性回落的鋸齒形。長時間任務Long Tasks里是否有明顯的GC大任務通常顯示為黃色或棕色區(qū)塊。GC頻率如果內存曲線還沒怎么漲就頻繁GC說明堆內存接近上限可能是泄漏或堆配置不合理。如果步進查看每個GC任務你還可以看到該任務的耗時和回收的內存量?;厥樟繕O小但GC卻頻繁往往意味著堆里積壓了大量無用對象這比單個大對象泄漏更隱蔽也更難查。5.3 Heap Snapshot的使用技巧對比兩次快照Heap Snapshot堆快照是排查泄漏的終極武器。操作流程在頁面上做一次操作前的基線操作等GC穩(wěn)定后錄制第一份Heap Snapshot。執(zhí)行疑似泄漏的操作比如打開關閉一個彈窗5次。等待幾秒錄制第二份Heap Snapshot。在快照列表里選擇兩份快照的對比視圖Comparison按對象數差值降序排列。重點查看新增的、無明顯業(yè)務意義的大對象、字符串、數組、Detached DOM節(jié)點。有個細節(jié)做快照前最好先手動觸發(fā)幾次GCDevTools的垃圾桶按鈕把無關的臨時對象清掉否則對比結果里會混入大量噪聲。我在實際排查中對比模式下最常見到的是Detached DOM節(jié)點和字符串增長——前者通常指向未解綁的事件或未清理的DOM引用后者往往是大JSON或日志拼接導致。5.4 Node.js服務端排查--inspect 與堆快照導出Node.js服務端的排查思路和瀏覽器類似但手段更靈活。推薦路線啟動Node進程時加--inspect參數然后用Chrome DevTools連接調試端口9229。用Memory面板做Heap Snapshot流程和瀏覽器端完全一致?;蛘哂妹钚泄ぞ遪ode --inspect配合heapdump模塊在懷疑泄漏的時間點手動導出堆快照文件離線分析。Node服務端還有個獨特場景是服務生命周期極長線上進程可能連續(xù)跑幾周所以緩存、連接池、動態(tài)定時器都要格外小心。我處理過的一個真實線上事故某個微服務的內存每3天漲1GB最后排查到是某個定時任務里每5分鐘創(chuàng)建一次大數組卻沒釋放引用——數組引用被存進了一個全局緩存Mapkey不重復導致Map無限增長。修復方式就是給緩存加LRU并在業(yè)務上避免把大數組長期掛在Map上。5.5 常見問題速查表現象可能原因排查方向修復建議頁面越用越卡內存階梯上升事件監(jiān)聽器未解綁Heap Snapshot搜Detached DOM組件卸載時解綁或用AbortController長時間運行后內存不回落全局緩存無限增長Comparison視圖看Map/Set大小加LRU、TTL、容量上限定時任務場景內存緩慢攀升setInterval回調閉包持有大對象Performance看GC頻率優(yōu)先使用setTimeout鏈式調用并顯式清理Node服務內存持續(xù)上漲全局或模塊級靜態(tài)變量持有數據--trace-gc看GC堆大小確認模塊級變量的生命周期及時置空每次操作后內存峰值遞增高閉包被意外的長期引用比較操作前后的Snapshot縮小閉包作用域用WeakMap/WeakSet大量字符串、數組對象無業(yè)務意義增長拼接JSON、日志或列表未清理按Constructor過濾String/Array避免無界數組采用滑動窗口或分頁5.6 WeakMap與WeakSet給不需要長期存活的數據一個逃生通道這里要專門提一下WeakMap和WeakSet。它們和普通Map/Set的區(qū)別在于對key的引用是弱引用GC可達性分析時不把WeakMap對key的引用作為存活依據。換句話說如果某個對象只被WeakMap引用沒有任何其他路徑可達那它就允許被GC回收。這對緩存與實例關聯數據的場景很有用。比如你給某個DOM節(jié)點掛了一份配置// 直接用MapDOM節(jié)點移除后配置仍然被Map引用內存泄漏 const configMap new Map(); function setConfig(node, config) { configMap.set(node, config); } // 改用WeakMapDOM節(jié)點被移除后節(jié)點和配置一起被GC回收 const weakConfigMap new WeakMap(); function setWeakConfig(node, config) { weakConfigMap.set(node, config); }用WeakMap的代價是它不可迭代、沒有size屬性不能遍歷和統(tǒng)計。所以它適合一對一、精確關聯的場景不適合需要批量管理的緩存。這是典型的內存管理手動兜底手段——引擎的GC不關心業(yè)務語義開發(fā)者用Weak結構來告訴GC這些數據允許被回收。6. 內存優(yōu)化的常用手段與長期實踐6.1 分代策略為什么說多用短生命周期對象不是罪理解分代GC后你會發(fā)現一個反直覺的結論大量創(chuàng)建短生命周期對象并不一定是性能問題——新生代回收很快V8對這類對象的回收成本極低。真正該避免的是短生命周期對象被無意中拉長生命周期。比如你在render函數里創(chuàng)建了一個超大數組讓它活著跨過多次GC晉升到老生代然后才被丟棄——這個晉升過程會消耗復制和整理的開銷。優(yōu)化思路有兩個方向減少大對象的創(chuàng)建頻率不要在循環(huán)里創(chuàng)建大JSON字符串先在內存中組裝好結構化數據再序列化。拉長生命周期不代表必須常駐內存如果數據確實需要復用做好緩存策略容量限、過期時間讓老生代里的數據能及時退出。6.2 字符串拼接與immutable的開銷JS字符串是不可變的。這意味著每次修改字符串比如str a實際上都創(chuàng)建了一個新字符串對象舊的字符串變成垃圾等待GC。在處理大量字符串拼接的場景日志、模板渲染時這個開銷會被放大。V8有一些內部優(yōu)化來應對比如字符串扁平化、字符串的延遲拼接但不可變的本質不會變。經驗之談在Hot Path高頻執(zhí)行的代碼路徑上優(yōu)先考慮Array.join、模板字符串、或流式寫入Node的string stream、瀏覽器的分批渲染而不是頻繁。對于超大日志輸出直接分塊寫比拼成一個大字符串再寫要安全得多。6.3 從工具鏈上阻止泄漏ESLint規(guī)則與測試斷言內存優(yōu)化不能只靠事后排查最好在代碼review和CI階段就攔截。推薦幾個可落地的做法ESLint規(guī)則開啟no-undef防止隱式全局browser環(huán)境下的直覺能用規(guī)則檢測。這些不是內存專用規(guī)則但很多內存泄漏的起點就是這些編碼疏忽。Unit Test中的內存斷言在Node.js測試里用global.gc()process.memoryUsage()對比GC前后的堆內存斷言內存回到基線附近。雖然這類測試容易有噪聲但配合一個相對寬松的閾值能攔住大部分明顯的泄漏。Performance Budget在大型團隊里給關鍵頁面內存占用設預算例如頁面空閑內存不超過某個值用定時任務自動檢測和告警。這屬于工程化治理短期成本高但長期效果最好。6.4 NODE_OPTIONS與堆大小調優(yōu)Node.js里可以顯式設置堆大小--max-old-space-size和--max-semi-space-size新生代大小。默認情況下Node的堆上限通常是2GB64位系統(tǒng)左右如果你的應用確實需要大內存比如數據處理、每進程并發(fā)模型可以調高node --max-old-space-size4096 app.js但這里要潑一盆冷水調大堆上限不是解決內存問題的萬能藥。堆越大Full GC的耗時越長停頓越明顯GC停頓導致的延遲反而可能惡化。合理路徑是先通過優(yōu)化代碼減少常駐內存讓堆上限保持在一個合理區(qū)間實在無法壓下來時再考慮調大堆或拆分進程。我自己在服務端調優(yōu)時習慣先把--trace-gc打開跑一天看看Full GC的頻率和耗時然后以GC頻率低、峰值內存可控、單次停頓小為目標來配參數。6.5 用結構避免泄漏設計層面的兩個建議最后分享兩個偏設計層面、但長期效果顯著的建議。第一減少全局可變狀態(tài)。把數據盡量封裝在業(yè)務類或組件的生命周期內避免所有數據都向全局對象上掛。全局Map、全局數組、全局事件源都是泄漏的溫床能局部作用域就局部作用域。第二合理使用取消機制。無論是前端還是Node異步操作請求、定時、WebSocket都有取消機制——AbortController、clearTimeout、clearInterval、WebSocket.close()。在代碼設計階段就把取消邏輯寫進每個異步操作的代碼塊里而不是事后補救。這一點在我做過的所有線上項目的復盤里都占了一個不小的權重。7. 實際項目的內存排查復盤一個富文本編輯器的泄漏案例很多人看完原理覺得懂了真正上手還是懵。我用一個實際項目做個完整復盤你看完應該能建立起從現象到定位到修復的完整閉環(huán)。模擬項目X是一個React富文本編輯器支持圖片、表格、提及等復雜塊。上線兩個月后運營反饋編輯器越用越卡打開超過30分鐘就開始掉幀甚至瀏覽器卡死。我接手排查時列出的線索是只有長時間編輯同一篇文檔才會出問題新建空白文檔沒問題卡頓和文檔內容量成正比但刪除內容后不會立刻恢復流暢。排查過程分三步。第一步先用Chrome任務管理器觀察內存。打開編輯器導入一篇大文檔靜置5分鐘觀察內存從120MB慢慢漲到180MB期間一直在點擊工具欄的格式按鈕。說明存在持續(xù)的內存增長且和用戶交互相關。第二步Performance記錄。打開DevTools錄制點擊將內容導出為HTML和撤銷重做幾次看到內存曲線呈階梯上升每個臺階對應一次操作。時間軸上出現多次Full GC長任務最長的一次超過200ms——這就是卡頓的直接原因GC暫停了主線程。第三步Heap Snapshot對比。操作前后各打一份快照對比模式下發(fā)現兩組明顯的增長一組是大字符串HTML導出相關另一組是React的Fiber節(jié)點Detached節(jié)點。仔細看Fiber節(jié)點的保留路徑發(fā)現它們被一個全局事件總線引用——編輯器的onChange回調把編輯器實例掛到了一個全局總線對象里而總線對象從不清理。每次操作觸發(fā)onChange就把新的編輯器快照包含整個文檔內容掛上去舊快照還被總線持有形成一個操作歷史快照無限累積的泄漏鏈。修復方案把全局事件總線改成組件局部的事件機制編輯器實例不再掛到全局。操作歷史改成有上限的棧比如最多保留50步超出上限的舊快照直接丟棄并把被丟棄快照的引用置空。給編輯器實例增加destroy()方法組件卸載時顯式置空所有內部引用。修完之后同樣導入大文檔操作30分鐘內存穩(wěn)定在140MB到150MB之間Full GC頻率明顯降低卡頓消失。這次排查看起來簡單但每一步都依賴前面對GC原理的理解——沒有堆快照對比、沒有對全局引用會拉長對象生命周期的認知可能很難想到事件總線是元兇。這個案例想強調的核心是JS內存管理的重點不是不要創(chuàng)建對象而是不要讓對象活得不該活的那么久。理解GC原理的價值恰恰在于你能判斷出這個對象到底該活多久誰在延長它的壽命。我自己在這條路上踩過不少坑有段時間為了減少GC壓力拼命手動置空變量、到處用WeakMap結果代碼可讀性下降反而引入了新bug。后來我總結出的原則是優(yōu)先從結構和依賴關系上解決問題縮小作用域、解除引用、控制緩存把手動置空和WeakMap當作補充手段而不是首選手段。內存管理的本質是管理引用而不是管理內存本身——引用關系清晰了內存自然健康。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久999久| 日本性爰一道本| 97香蕉人人乳| 大香蕉啪啪啪| 国语av最新自产拍在线观看| 午夜超爽| 日韩性爱小视频| 美熟女逼导航AV操逼| 首页亚洲国产高跟丝袜诱惑视频| 国产无马av| 国产AV色黄看到爽| 香蕉视频欧美一卡二卡| 国产黄色剧情影片麻豆免费播放| 大香交伊人网| 伊欧美综合视频| www久久国产精品| 91天美免费| 日韩精品电影| 欧美激情久久久久| 亚洲诱惑天堂| 91精品国| 欧美激情精品久久久久久| 久操影视| 91劲爆| 国产小炒后入式| 热天堂一区二区| 视频二区美腿丝袜制服人妻欧美 | 国产精品不卡高清在线观看| 久9九综合在线| 久久久涩| 伊人久久综合精品欧美| 91精品无码人妻系列| 欧美,日韩综合久久| 久久黄片国产一区二区| 老熟女乱子伦中文字幕一区二区| 精品亚洲国产成人精品| 天天色播亚洲综合网站| 色女女女导航| 自拍盗摄一区| 91欧美美女日韩国产婷婷| 久久99手机免费视频| 宅男午夜在线视频| 超碰人妻中文在线| 无码人妻系列少妇| 992大香蕉| 久久久久久999| 中文字幕在线免费观看2| 精品午夜福利| 亚洲第一页第二页激情| 黑人精品一区二区在线播放| 日韩在线性爱免费视频| 日韩国产乱子伦App| 欧美亚洲色图另类国产| 亚洲色欲天天人妻无码系列专区| 国产欧美美女免费观看视频| 91骚妇| 老熟妇一区二区三区啪啪| 在线亚洲丝袜视频网站| 欧美97爱| 在线免费观看日韩一区| 91九色网| 久久綜合很很很| 是还免费视频1727我| 国产精品一区二区麻豆| 久草精品国产99| 波多野结衣一级视频| 粉嫩粉嫩一区性色AV片| 96爱综合| 国产精品97视频| 91精品人| 欧美成人一区二区三区在线播放| 97人肏| 高清肉丝中文无码| 五月天亚洲色图| 九月丁香婷婷色| 亚洲国产日韩欧美熟妇在线| 国产 大胆 对白| 91性网| av在线免费一区二区| 欧美 亚洲 偷拍自拍| 亚洲 中文 女同| 欧美日本不卡| 91人妻人人澡人人爽人人精品| 欧美大香蕉专区网| 亚州日韩97| 91色插| 精品人妻av在线播放| 亚洲情色电影网| 亚洲天堂日本| 国产东北女人在线视频| 久久精品亚洲东京热色播| 欧美玖玖爱免费玖玖| 国产精品人妻无码久久久互動交流| 搡老女人老妇女AAA一VU麻豆| 亚洲黑丝在线| 有码色中文字幕在线观看| 人妻精品一区二区| 色婷婷久久| 啊啊啊好大好湿| 亚洲高潮少妇| 2017亚洲天堂| 美女在线H91| 在线不欧美| 激情干在线| 怡春苑东京热| 国产强奸AV在线| 99热这里是精品| 夜夜免费视频| 久久一区二区高清免费| 日本 免费 一区二区三区 久久香蕉 | 欧美,日韩,中文,另类| 琪琪精品免费一区二区三区 | 97操综合| 99ri在线视频| 日韩情色一区二区| 99re6国产精品99re在线| 亚洲 在线| 亚洲欧美国产其他二区| 91在线丝袜| 精品无码秘 人妻一区二区| 天堂伊人久久| 一级免费精品| 黄片色区软件| 91久久精品美女高潮喷水| 岛国大片在线观看网站入口| 最新av在线| 五月丁香六月综合缴清无码 | 久久久久免费少妇| 偷拍99| 精品国产一区二区三区四区在线看| 女优视频第10页| 91情色在线| 五月丁香激情综合网| 亚洲国产中文字幕| 日韩欧美字幕亚洲一区二区| 日韩欧美性爱电影在线观看| 丝袜制服字幕在线| 亚洲密乳AV| 日韩少妇在线视频| 国产亚洲日本精品在线| 神马麻豆福利院 | 91欧美www| 中文字幕性感少妇av| 99热这里只有精品1| 久久久国产成人一区二区三区在线| 天天操天天7| 亚洲成人久久美女| 91天天看| 91美女高潮| 婷婷五月天成人网| 伊人操你| 美女黄色91| 人人乐大香蕉| 欧美探花网| 久艹视频在线| 色九九九| 殴美大黄片| 欧美日韩久久精品爱爱| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲激情网一二三四区| 日韩操p| 69丨亚洲丨精品丨入口免费播放| 丁香六月婷婷| 一级久久性爱视频| 日韩免费在线观看不卡| 亚洲偷91色| 久久99操天天日| 亚洲免费成人在线高清无码视频 | 成人麻豆av电影网站| 快播久久人人aV| 亚洲精品欧洲精品| 久久精品一区| 久久99国产综合精品女同| 91伊人久| 岛国免费视频在线| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 丝袜狠狠草尤物 91| 97超碰碰碰| 少妇xx精品| 酒色综合网| q2午夜理论片夜色av| 超碰人人妻| 欧美性爱伊人| 日韩人妻制服丝袜av| 国产内射爽爽大片| 国产999精品久久久| 91美女视频在线免费观看| 狠狠狠一区二区三区| 婷婷丁香熟妇综合网| 欧美经典一区二区三区| 欧美黄色大片在线观看| 91在线精品一区二区三区| 91美| 婷婷性网| 欧美九一精品久久久熟妇| 男生女生啊啊啊啊| 精品然女一区二区| 手机不卡视频不卡在线一二三区| 欧美图片偷拍| 六月丁香网| 久久婷婷综合国际产色怕| 97精品熟女少妇一区| 2017av无码免费无线播| 日本性爱视频一级| 欧美日韩*字幕一区| 蜜臀99久久精品久久久懂爱| 日韩免费av片高清无码| 亚洲日韩精品久久久久一区壹牛| 亚洲va有码在线天堂| 一中国女人毛片水真多| 在线日韩精品一区二区三区| 91欧美亚洲| 亚洲黄色AV电影| 亚洲中文丝袜美腿诱惑字幕| julia国产在线 | 免费看日产一区二区三区| 亚洲伊人a线观看视频| 北约熟女超碰| 亚洲97久久精品亚洲| 日韩丰满熟妇| 神马精品视频| 高清不卡国产| 玖玖爱一区在线| 热久日综合| 狠色婷婷久久一区二区三区_| 国产十八禁视频| 欧美成人综合| 夜夜操夜夜高潮夜夜爽国产精品区| 啊啊啊久久久视频| 97九色| 欧美精品久久久久久久丰满| 中文字幕日韩人妻视频一区二区三区| 亚洲无码久久久久久久| 国产成人资源| 人人澡人人弄| 日日夜夜精品视频| 久久久久成人亚洲国产| 九九玖玖精品| 破处bbq| 性猛交| 欧美日韩黄片精品在线| 国语人妻精彩刺激| 96国产污污污丝袜| 黑人娇小av在线播放 | 麻豆人妻少妇在线免费观看| 欧美综合综合| 五码视频在线观看| 日韩无码专区| 国产精品久久久久久久久久久久久久久久久久| 亚欧洲一区二区视频| 日本Suv精品一区二区| 精品日韩人妻视频| 亚州操操穴网| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 天天天天操| 欧美色66| 日本久久超碰| 日本五十路熟女一区二区| 9九九九九视频在线观看| 秋霞鲁丝午夜无码一区二区三| 欧美综合色,www| 国产精品爱欲| 天天综合日韩网| 嗯嗯嗯啊啊啊干死我吧| 国产午夜精品理论片a大结局| 日韩久久.一级黄色片| 日韩一区二区精品视频| 超碰偷拍| 波多野42部无码喷潮在线观看| 久久久一区二区三区四曲免费听| 国产女人9999| 亚洲国产精品99久久久| 天天弄欧美| 欧美天天干| 国产亚洲日本精品在线| 亚洲AV人人澡人人爱| 中文字幕天堂在线| 欧美视频在线第3页| 色香91| 日本狂喷奶水在线播放212| 国产精品青青草| 91精品国| 999岛国大片| 青青欧洲黑| 国产精品ⅴ无码大片在线看.| 99精品在线观看| 九九久精品| 成人无码影片视频在线| 天天激色| 国产尹人在线视频免费| 久久久精品久久| 性爱综合一区二区| 国产亚卅97| 91操熟女| 伊人久久亚洲色欲综合网站 | 午夜.DJ高清在线观看免费7| 国产亚卅97| 91人妻最真实刺激绿帽| 激情四射婷婷六月天| 精品无码不卡视频| 91精品久久久久久77777| 亚洲乱色熟女一区| 乱子伦一区二区三区国产精品| 收看日本人日bb| 97精品国产精品免费观看| 91人妻最真实刺激绿帽| 97国产伦理| 熟女突然公开看18禁影片| 大屁股熟女一区二区三区| 超碰成人公开| 91日韩网站| 开心激情婷婷| 日韩一级久久毛片| 青木玲在线不卡| 一类无码操逼视频| 97欧美日韩综合| 日韩AV一区二区三区四四| 五月丁香激情四射| 五十路二区在线| 日本操逼视频导航| 久久大黄片| juliaann丝袜大战黑鬼| 久精品无码av一区二免费国产在线观看| 色天天野狼综合社区| 综合久久中文字幕综合日韩精品| 青草一区二区| 日韩激情视频| 久久婷婷五月| 欧美黑人精品在线播放| 久久九色| 91色色综合| 天天日天天舔| 久久久久元码视频| 99日韩| 美女熟妇色| 久久久久深夜无码| 亚洲91网。| 日韩免费看黄片| 久草午夜| 亚州,欧美在线| 四虎影库国产精品免费| 国产中文字幕曰本毛片| 少妇久久久久久久久| 国产精品天干天干综合网麻豆| 色色激情五月天| 一级二级三级黑人无码| 色97欧美| 九七毛片九九毛片| 91女人的网站| 五月天激情综合网| 蜜乳AV色欲AVAV无码| 日本熟女不卡视频| 91亚洲色图| 69久久| 熟妇人妻一区二区三在线| 久久精品一区二区三区不卡| 人妻乱仑一区二区三区| 欧美一区二区三区四区综合| 中文字幕一区二区视频在线观看| 亚州欧美综合| 国产第二页| 日本不卡高清免v欧美日韩在线观看| WWW黄片COM| 隔壁邻居波多野结衣中文字幕| 日日骚中文字幕| 丝袜加勒比| 尤物视频网 刘玥| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 91亚洲黑人| 九九色影院| 久精品无码av一区二免费国产在线观看| 另类图片欧美激情综合| 一区在线精品中文字幕| 亚洲加勒比| 97国产精品一区| 综合情欲网| 久久久久久裸体| 激情视频一二三| 97超碰色屌| 久久综合中文国产| 淫骚熟女一区二区三区| 使劲用力艹少妇视频一区二区| 99青青草国产视频| 亚欧美综合网。| 97超碰免费生活| 国产精品一区二区后入| 日韩精品系列| 亚洲久久天堂| 天天日夜干| 91情色| 97欧美视频| 韩国免费播放一级毛片| 秋霞操逼片| xxxx网站亚洲精品| 欧美v亚洲v日韩v最新在线二区| 国产亚洲日韩在线三区黑人| 强奸乱伦资源| 日韩中文欧美| 九九九九九九九九九九九免费国产| 色婷婷aV一区二区三区麻豆综合| SS久久| 色综合久久夜色精品国产天堂| 欧美亚洲高清不卡| 国产午夜福利合集| 欧美综合网在线| 婷婷av在线中文字幕| 高清国产性猛交xxxx乱大交| 丰满高潮18xxxx| 五月天婷婷影院| 久久久9视频| 青青青艹在线视频| 欧美天天干| 精品久久久久久无码| 国产91精品福利在线| 久久久国产三级黄色片| 久热色情精品| 亚洲区限制级 99| 五月丁香激情四射| 岛国黄色大片网站| 欧美不卡在线美女| 日韩av情韩国爱禁区av一区二区| 色五月AV| 丰满少妇乱子伦精品无| 青娱乐 成人娱乐在线| 成熟熟女国产精品一区二区 | 99操碰| 99热aaa| 操久久久久| 亚洲精品性爱片| 欧美色五月| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 看大黄色大片原件| 污啪啪啪视频| 亚洲人精品久久久| 人人贴人人摸| 操死我干死我| 伊人久久AV诱惑悠悠| 黄片视频,下载| 97精品国产97久久久久久免费| 欧美精品xxxwww| 国产欧美第五页| 97网址97| 在线观看高清AV| 男人天堂久久精品| 97精品一区| 99久久久无码精品国产人| 淫妻综合网| 久久久久96| 黄色视频60分钟| 啊嗯好大视频在线观看| 丰满熟女一区二区三区在线播放| 日本精品不卡一二三区| 久久久久久久9最新免费视频观看| 91精品国产91久久青草| 婷婷五月天影院| 91日日夜夜| 国产一级内射无挡观看| 爽爽爽免费视频| 狠狠91| 亚洲男人的天堂亚洲| 国产三级中文字幕粉嫩 | 青娱乐手机日韩在线视频| 久久精品国产亚洲5555| 日韩无码嘿咻黑热久| 熟妇人妻丰满久久久久久久无码| 翔田千里av一区二区三区| 精品妇操一区二区三区| 99热99在线播放激情| 传媒免费一区二区三区| 日逼视频日本| 亚洲图片在线| 韩日无码在线观看| 风间由美日韩欧美久久| 婷婷99| 狼人狠干| 蜜色网色哟哟| 自拍偷拍草一草| 91热情品| 精品亚洲国产成人av网站| 成人五月天色网| 日韩人妻制服丝袜av| 中文字幕超碰CAO| 岛国黄| 日韩干B| 婷婷综合五月天| 91五十路| 日日骚 av| 操逼逼福利视频| 一本大道久| 日韩精品一二三四| 三级日韩一区二区三区| 一区二区三区成人| 狠狠爱综合网| 久久免费99精品久久久久久| 日本精品久久久久久久| 五月综合色| 人妻少妇久久中文字幕一区二区 麻豆| 大香蕉伊利av| av绯色| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 日韩中文字幕2020| 丁香五月影院| 黑人白女精品一区| 91观看 国产白丝| 九九九久千久久激情蜜桃在线看| 夜夜操青青草| 78精品在线| 久插不卡| 日韩欧美资源| 精品高清av中文字幕| 色爱综合网| 亚洲无线观看久久| 美国三级日本三级久久99| 五月丁香激情综合网| 国产精品午夜AV完会免费| 天天看片麻豆| 五月丁香久久| 超碰在线香蕉| 天天日夜干| 天天操天天日天天干| 97精品综合| 素人一区二区三区日韩| 欧美熟妇精品黑人巨大91| 综合激情97 | 中文欧丝袜诱惑| 一区二区三区四区色图| 中文字幕成人理论在线| 久久精品国产亚洲5555| 强乱老妇中文字幕| 日韩午夜国产| 少妇无码太爽| 成人欧美一区二区三区黑人一| 日韩欧美成人午夜福利| 好吊色综合| 国模久久在线| 国产精品久久久九九九| 亭亭丁香激情| 五月丁香综合| 9色在线| 国产女人和拘做爰视频| 国语对白露脸XXXXXX| 97美日韩视频| 国产自偷| 97精品视频在线| 久草综合视频| 美腿丝袜偷拍亚洲欧美| 青娱乐av在线| 欧美嗯啊……在线观看视频免费| 中文字幕成人| 欧美精品99久久久| 久久久精品国产亚洲AV无码| 在线强奷到舒服的无码视频| 青椒国产97在线熟女| 国产精品不卡一区二区三区av| 久久黄人人爽视频| 日本精品一区二区不卡| 东北老熟女| 97射欧美| 欧洲视频在线| 亚洲丝袜诱惑| 2024年最新色情网站在线观看| 另类欧美色| 日躁天天爽爽| 日韩免费在线观看不卡| 亚欧高清| 99久久精品无码一区二区毛片免费| 秋霞网无码| 亚欧免费观看视频| 激情五月综合开心五月| 精品国产丝袜一区二区三区乱码| 日本一级婬片试看三分钟| 国产最新小视频在线播放下载| 国产一区自拍欧美日韩| 3P乱轮视频| 亚洲精品三| 激情99| 好淫网一二三视区| 天天干天天日天天射黄色片| 亚洲偷拍欧美激情| 欧美草草高清日韩视频| 日本综合色图| 人人贴人人摸| 国产成人精品亚洲日本| 九九内射在线| 91爰爱欧美| 欧美,亚洲,日韩,v,天堂,手机在线观看| 97精品视频在线| 91亚洲情色| 久久久精品91八戒| 黄片不用下载在线观看| 日本有码影片下载| 亚洲性猛| 无码人妻一区二区三区免费九色| 1769国内精品视频| 色婷婷五月综合激情中文字幕| 91亚洲人电影| 牛牛久久国产精品视频一二三| 久久久久深夜无码| 最新无码国产| 桃花色涩综合影院| 天堂国产AV| 一二三四区电影| 一二三区操逼国产91| 久久无码电影| 大香蕉伊人网WWWn0n| 国产吹潮女在线观看| 女人精品内射国产99| 能在线播放的国产三级| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 久久亚洲AV无码白度| www.大香| 密臀在线免费观看| 精品人妻高清麻豆av| 人人操,人人插| 久久精彩免费视频| 极品AV网站在线观看| 国产精品久久| 大香网伊人久久综合| 国产丰满少妇久久久精品影院| 人妻天堂三区| 久久久久久AⅤ无码免费肉站| 五月天色图| 午夜男人的天堂| 亚洲天堂无码| 精品中文日韩字幕视频| 国产婷婷综合在线观看| 国产熟女少妇一区| 漂亮人妻被强中文字幕hd| 国产不卡免费在线视频| 成人精品视频一区二区| 97日韩| 欧洲色| 亚欧操逼片在线观看 | 尤物网址| 一牛一区二区三区久久| 在线播放成人高清免费视频| 亚洲影视综合网| 日韩无码第3页| 中文字幕精品区先锋资源| 中国熟女网站| 超碰成人公开| 欧洲精品久久| 成人5码视频| 狠色婷婷久久一区二区三区_| 国产肏逼网站| 久久內射| 欧美极品性爱天天射| A啊啊在线观看| 国产精品久久久久久久AV大片 | 国语精品av| 日韩成人电影AV| 一区二区无码视频| 99操99| 久久春色| 蜜臀av中字字幕网站| 黑人免费福利视频| 九九拍拍精品视频在线播放| 黄色片,com| 九九九九九九九九九九九九九九九女| 人人看欧美性爱| 欧美综合传媒| 综合色久| 97精品| 欧美 日韩 国产传媒| 一个国产在线综合网站| 欧美大片一区二区三区 | 亚洲,欧美,综合网| 激情文学网伊人| 呦呦一区| 素颜老阿姨乱情色| 亚洲 欧美日韩 另类| 蜜臀AV一区二区三区| 人人天天欧洲| 看免费的黄片| 97国产中文| 久久草草欧美精品| 亚洲无码国产探花在线观看| 91性感网站| av国产无码| 欧美一区二区三区不卡高清视频| 蜜臀99999| 亚洲最大无码中文字幕网站| 97超碰中文在线| 绑缚麻绳人妻寝取完整版| 福利在线黄片| 亚洲无码视频免费在线观看网址!| 黄总AV色图| 乱老女人一区二区视频| а√天堂资源官网在线资源| 亚洲人人夜夜澡人人爽| 天综合中文| 国产一区二区精品久久99| 啊啊啊骚| 美女诱惑在线一区| AV 少妇 人妻 偷拍| 久久久精品91八戒| 超碰人妻久久| 亚洲AV在线资源| 91人人看| 婷婷五月天av| 高清国产性猛交xxxx乱大交| 亚洲黄色电影| 超碰97首页| 夜夜夜久久| www九九热| 思思热免费在线视频| 欧美熟妇精品黑人巨大91| 欧美午夜视频| 岛国小电影| 一区在线观看中文字幕| 草草影院最新网址| 亚洲欧洲成人在线电影| 国内毛片四区| 久久少妇人妻| www.高清无码诱惑一区.com | 欲射影视| 99999精品成人| 五月丁香六月婷| 日韩一级片在线看| 亚洲中文字幕久久人妻| 精品欧美不卡在线播放| 九九热三级片| 日日骚av| 欧美色图小说综合| 亚洲无限观看| 最新av在线| 青青草国产亚洲精品久久| 亚洲综合小说另类图欧美视频激情小说色五月天 | 精品一二三区久久AAA片| 99老司机精品视频在线观看| 中文字幕蜜乳av| 亚洲资源站| 久久精品久久久久久久| 啊啊啊好大好深| 男人的天堂kva| 久久久久久中文| 色婷婷一区二区三区久久午夜成人不| 日韩精品人妻中文字有码在线 | 操屄日韩| 日韩一级欧美一级国产一级台湾| 天堂男人网| 97天天摸天天爽| 亚洲影视综合| 91操熟女| 成人蜜乳小视频网站| 亚洲无码 国产无码| 91性色| 伊人网免费视频| 黑人精品一区二区在线播放| 欧美五十路熟| 日韩人妻播放| 国产成人www免费人成看片| 在线视频免费播放一区| 在线人人人人人人精品超| 在线观看精品国产免费| 色情五月婷婷| 久久大香蕉手机高清| 嗯嗯啊啊操死我| 老汉网| 久久影视二区三区行押| 日韩本不卡视频在线观看| 欧美亚洲丝袜人妻制服中文99| 92一区二区| 国产真乱mangent| 亚洲精品无码久久AV| 爱媛媛久久国产福利| www五月| 99超碰色| 色偷综合| 人人操人人肉久久精品| 人人干黄色| 精品伊人久久久大香线蕉小说| 婷婷丁香五月综合| 麻豆区99999| 蜜臀无码一区二区| 美女久久久久久久久久久| 91久久久亚洲| 久久久精品视频免费观看| 欧美色五月| 91熟女综合| 亚洲精品国产拍免费91在线| 人妻色偷色噜| 亚洲黄网在哪免费看| 97视频观看| 东京热99999| 性综合网| 午夜福利视频在线一区| 丰满翘臀美女影院视频| 99re在线视频| 久久狠狠色噜噜狠狠狠狠97| 极品美女福利在线观看| AV色天香在线| 中文字幕av一区二区三区人妻少妇| 国产精品香蕉| 亚洲Av无码成人精品国产| 97干com| 九七超碰人人乐| 国模私拍一区二区三区神乳| 99re在线观看| 久久美国毛片| 国产日韩无码一区二区三区久久区| 亚洲Av无码成人精品国产| 久久婷婷在线观看视频| 男人天堂2019| 丰满人妻一区二区三区大胸懂色 | 欧美爱三级日韩久久| 九九久久综合| 国产乱青青草久久| 欧美日韩*字幕一区| 久久一二三四五六七八九区区区| 天天操天天谢| 8x福利精品第一福利视频导航| 长长久久免费视频| 少妇人妻在线| 在线观看AV片| 高潮嗯啊性感美女久久久| 天天爽天天操啊啊啊| 探花一区在线| 青青伊人这里只有精品| 欧美A片中文字幕| 白丝1区2区3区| 欧美色青| 一区二区激情国产熟女| 久久久免费高清中文视频| 在线a v| 国内操逼视频二区| 欧美福利视频啊啊啊啊| 91AV老熟女视频| 97欧美精品| 韩国久久97| 国产99热| 国产原创精品| 小说区 图片区色 综合区| 香蕉在线一区二区三区| 99re欧美| 婷婷综合视频| 加勒比综合88| 淮穴色AV| 日产操逼| 97超碰逼| 精品九九国产无码| 少妇色综合| 综合欧美日韩在线观看| 激情情色五月天| 亚洲最大无码中文字幕网站| 97在线日韩中文字幕| 亚洲国产欧美中文永久| 淫纸中9区| 九九激情网| 91色香| 欧美性爱一内片一区二区三区| 毛片久久| 欧美日韩国产电影| 天天综合网日韩7799| 日韩淫色网| 日韩性爱网址| 天天久久| 9 7超碰在线免费观看| 三级激情网站| 超碰偷拍| 日本超碰在线国产一区| 欧洲性爱无码区| 性老妇一区二区三区| 黄色区免费观看中文字幕| 欧美日本视频一区| 中文字幕老熟妇黄色视频| 国产高清午夜成人在线观看| 亚洲第91页| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩性爱长视频免费| av午夜玫瑰| 男男H黄动漫啪啪无遮挡网站| 亚洲a色| 91欧美长吊| 国产激情在线| 欧美综合网| 伊人精品视频| 爱我干综合| 精品国产av一区二区三区四区入口| 亚洲色资源| 六月色色| 激情婷婷综合久久| 丝袜性亚洲| 五月婷婷爱六月丁香色| 精品蜜乳AV免费观看| 色香欲天天天天综合色| 97AV爱| 久久无码电影| 日本乱人伦片中文三区| 亚洲脚交| 中文字幕日韩精品一区二区三区| 久久久久成人亚洲国产| 麻豆久久一区二区三区| 熟妇高潮精品一区二区三区下载| 婷婷综合五月天| 影音先锋少妇| 欧综合网| 中文字幕一区二区三四五区日日骚| 99热色精品| 精品视频免费在线一区| 亚洲色图欧美| 国产一区二区精品在线视频| 久久久99久9| www狠狠| 95自拍视频在线观看| 91丝袜| 久久亚洲天堂| 亚洲视频,小说| 欧美日韩丝袜| 激情看片网站| 日本免费人成视频播放120秒| 丰满人妻一区二区三区蜜桃视频| 欧美第二页午夜| 国产视频一区二区三区久久亚洲天堂| 乱伦系列一区二区| 日本三级A片网站com| 热99re69精品8在线播放| 五月天人妻综合| 97丝袜亚洲在线播放| 福利风月五月天影院| 天天插天天射| 日本日皮视频逼| 亚洲一级性爱视频免费看| 张柏芝国产一区在线观看| 精品人妻久久久| 综合网97| 色网1| 亚洲成人色情五月天丁香花| 97精品国产97久久久久久免费| 午夜男女爽爽爽在线视频| 久久久久亚洲av综合波多野制衣| 在线日韩精品一区二区三区| 色与欲影视| 大粗鳼巴久久久久| 91模特在线观看| av日韩中文字幕| 中文字幕午夜精品久久久| 亚洲欧美日韩电影网站一区| 欧美熟女妇同| 激情一区二区| 99久在线精品99re8蜜桃| 亚洲欧美内射| 天天综合站| 91超碰在线观看| 校园春色美腿丝袜 | 9999九九九久久久| 人人搡人人肉久久精品| 黄资源| 久久久专区| 日韩欧美中文字| 97就爱干| 国产精品大屁股999| 天天天做天天天爱天天天爽| 美女上床网站| 久久久久白虎| 男人在线天堂| 人妻偷拍一区二区三区| 欧美日韩大黄片| 九色在线熟女国产黑人| 欧美一级A片在线看视频性色| 成人片在线播放| 欧美熟爽综合| 久久久久久久久久久久黄色 | 亚洲女毛多水多21P| 丁香五月激情啪啪| 大香蕉综合| 天天躁狠狠躁av| 亚洲欧美碰碰| 亚洲国产精品成人综合| a v网站在线播放| 六月丁香网| 九九成人精品| 香港久久久| 亚洲一区日韩精品| 91精品啪在线观看国产城中村| 欧美在线视频99| 精品美女在线视频| 九九九九九九免费视频| 亚洲九九九九| 久久东京伊人一本到鬼色| 丁香五月天堂| 激情终合网| 亚洲情色 欧美| 欧 美 自 拍 偷 拍| 国产高清无码一区二区三区四区皇冠| 激情文学网伊人| 成人精品视频| 男人的天堂2019| 婷婷丁香五月天综合东京热| 亚洲中文字幕噜噜噜久久久| 精品国产国产AV| 黄页av| 欧美顶级黄色大片免费| 五月天丁香欧洲日韩| 国产精品久久久久久9999| 麻豆天美传媒毛片| 亚洲古典另类欧美在线| 中文字幕视频在线观看一区二区| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 免费精品中文字幕| 久久久久久久久久久六六| 60秒免费视频| 中日韩免费看男女操逼大全| 日本在线激情一区二区三区| 亚洲淫乱骚妇AV| 欧美色青| 日韩性爱高清免费视频| 国产成自自拍在线观看| 国产一区在线播放| 破苞ⅩXXX性无码动漫无码| 熟女自慰久久久| 国产女人视频三四五区| av资源在线播放天堂| 久久熟女久| 亚洲av综合伊人久久| 中文字幕人妻丝袜| 一二三区视频在线观看| 国产小黄片在线免费观看| 蜜臀久久99精品久久久久免费观| 五月天综合在线| 二级毛片| 99在线无码精品秘 入口黑人| 性色高清在线| 97爱| 东京热激情视频一二三区| 96一区二区三区| 91在线精品| 性交一区二区在线播放| 国产最火爆久久国产网站网站| 人人爽天天爽| suv精产一二三区| 欧美婷婷| 亚洲人妻色图| 久操大香蕉| 久伊人网78| www久久99| 无码二级三级| 亚洲成人综合在线| 亚洲欧美综合网| 久久九九网| 亚洲欧美骚| 夜夜操狠狠操| 青娱乐妇女性生活| 亚洲图片欧美日韩| 亚洲AV无码乱码| 丝袜熟女2P| 51国产午夜精品视频| 国产熟女一区二区丰满| 国产在线强奸视频| se,,,亚洲欧美| 多乙久久久久久| 综合熟妇一区二区三区| 久99热| 蜜臀久久99精品久久久久久无删减 | 欧美日韩理论一区| 26uuu国产亚洲综合| 亚洲男人的天堂网| 国产一区二区三区影片| 伊人超碰97| 欧美久久毛片基地| 2020中文在线一区二区三区| 97操综合| 国产熟女少妇一区| 在线观看不卡一区二区三区| 足交视频老司机| 99色综合| 日本性感人妻91| 大香蕉综合在线| 久久xxxx| 富女玩鸭子一级毛片| 亚洲综合贴图91| 性爱视频久久| 午夜视频久久久久一区| 少妇内射视频| 一区二区偷拍拍视频| 青娱乐福利99| 国产自啪精品视频网站黑丝| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 韩日性爱av| 一卡二卡三卡| 人妻出轨一区二区三区| 日本Xx性爱| 亚洲人天堂| 亚洲熟女一区| 好吊妞转入那个网| 日日日日做夜夜夜夜无码| 加勒比色99999| 麻豆九九九| 97人人干人人操| CCYY草草影院地址入口| 一本色道久久综合亚洲二区三区| 日韩pv中文| 国产精品久久久久久 百度| 97综合| 国产中文字幕在线| 99999精品成人| 麻豆这里只有精品| 日本欧美一区二区三区视频麻豆| 中文字幕欧美精品亚洲日韩蜜臀| 亚洲91网。| 五月天激情小说| 2019天天干天天操| 黑人猛交| 九九九成人| 中文一区在线日| 九九九久千久久激情蜜桃在线看| 久久久成人国产精品无码| 免费αV在线视频| 精品传媒在线一区| 操操操日本的逼| 屁股久久久久久| 日韩特一级久久| 欧美在线l亚洲| 日产国产精品中文久久婷婷| 亚洲av无码成人精品国产| 2019久久久久久久久福利| 蜜臀一区二区三区在线 | 伊人网青青| 凹凸精品熟女在线观看| 校园春色美腿丝袜 | 国产福利影视| 国产原创剧情在线丝袜| 亚洲精品白浆高清久久久久久| 熟女少妇视频| 天天综合站| 天天综合网~91入口| 亚洲成人精品久久久| 久久综合乱子伦国产免费| 久久女人一区二区三区| 东京热免费视频| 欧美性爱另类综合| 欧美网站免费| 手机看片1025| 美女黄频a美女大全免费皮| 一区二区三区 日韩欧美| 日韩一性一交一A片俄罗斯| 亚州一区二区成人片免费| 色就色综合| 手机在线播放国产福利| 少妇啪啪自拍| 久久亚洲AV无码专区首页| 超碰在线观看av不卡| 曰韩操B| 麻花豆传媒剧国产MV出差| 日韩激情啪啪啪| 亚洲中文一区二区三区| 国产三级中文有码在线视频| 中文字幕中文字幕一区二区| 欧美人与性动交a美精品| 在线视频免费播放一区| 久久精品国产96精品亚洲拳交| 爆操无码| 天天插天天干| 蜜桃精品一区二区三区ww| 91色爽欧美| 999 久久久| 九九九国产精品| 玖玖久久久| 欧美性爱综合,免费| 天天草夜夜草高潮片|