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

贈(zèng)你13張圖,助你20分鐘打敗了「V8垃圾回收機(jī)制」!!!

開發(fā) 前端
并行式GC允許主線程和輔助線程同時(shí)執(zhí)行同樣的GC工作,這樣可以讓輔助線程來分擔(dān)主線程的GC工作,使得垃圾回收所耗費(fèi)的時(shí)間等于總時(shí)間除以參與的線程數(shù)量(加上一些同步開銷)。

前言

大家好,我是林三心。前兩天,無意中看到了B站上一個(gè)講V8垃圾回收 機(jī)制的視頻,感興趣的我看了一下,感覺有點(diǎn)難懂,于是我就在想,大家是不是跟我一樣對(duì)V8垃圾回收機(jī)制這方面的知識(shí)都比較懵,或者說看過這方面的知識(shí),但是看不懂。所以,我思考了三天,想了一下如何才能用最通俗的話,講最難的知識(shí)點(diǎn)。

普通理解

我相信大部分同學(xué)在面試中常常被問到:”說一說V8垃圾回收機(jī)制吧“。

這個(gè)時(shí)候,大部分同學(xué)肯定會(huì)這么回答:”垃圾回收機(jī)制有兩種方式,一種是引用法,一種是標(biāo)記法“。

引用法

就是判斷一個(gè)對(duì)象的引用數(shù),引用數(shù)為0就回收,引用數(shù)大于0就不回收。請(qǐng)看以下代碼:

let obj1 = { name: '林三心', age: 22 }
let obj2 = obj1
let obj3 = obj1


obj1 = null
obj2 = null
obj3 = null

圖片圖片

引用法是有缺點(diǎn)的,下面代碼執(zhí)行完后,按理說obj1和obj2都會(huì)被回收,但是由于他們互相引用,各自引用數(shù)都是1,所以不會(huì)被回收,從而造成內(nèi)存泄漏。

function fn () {
  const obj1 = {}
  const obj2 = {}
  obj1.a = obj2
  obj2.a = obj1
}
fn()

圖片圖片

標(biāo)記法

標(biāo)記法就是,將可達(dá)的對(duì)象標(biāo)記起來,不可達(dá)的對(duì)象當(dāng)成垃圾回收。

那問題來了,可不可達(dá),通過什么來判斷呢?(這里的可達(dá),可不是可達(dá)鴨)

言歸正傳,想要判斷可不可達(dá),就不得不說可達(dá)性了,可達(dá)性是什么?就是從初始的根對(duì)象(window或者global)的指針開始,向下搜索子節(jié)點(diǎn),子節(jié)點(diǎn)被搜索到了,說明該子節(jié)點(diǎn)的引用對(duì)象可達(dá),并為其進(jìn)行標(biāo)記,然后接著遞歸搜索,直到所有子節(jié)點(diǎn)被遍歷結(jié)束。那么沒有被遍歷到節(jié)點(diǎn),也就沒有被標(biāo)記,也就會(huì)被當(dāng)成沒有被任何地方引用,就可以證明這是一個(gè)需要被釋放內(nèi)存的對(duì)象,可以被垃圾回收器回收。

// 可達(dá)
var name = '林三心'
var obj = {
  arr: [1, 2, 3]
}
console.log(window.name) // 林三心
console.log(window.obj) // { arr: [1, 2, 3] }
console.log(window.obj.arr) // [1, 2, 3]
console.log(window.obj.arr[1]) // 2


function fn () {
  var age = 22
}
// 不可達(dá)
console.log(window.age) // undefined

圖片圖片

普通的理解其實(shí)是不夠的,因?yàn)槔厥諜C(jī)制(GC)其實(shí)不止這兩個(gè)算法,想要更深入地了解V8垃圾回收機(jī)制,就繼續(xù)往下看吧!!!

JavaScript內(nèi)存管理

其實(shí)JavaScript內(nèi)存的流程很簡(jiǎn)單,分為3步:

  • 1、分配給使用者所需的內(nèi)存
  • 2、使用者拿到這些內(nèi)存,并使用內(nèi)存
  • 3、使用者不需要這些內(nèi)存了,釋放并歸還給系統(tǒng)

那么這些使用者是誰呢?舉個(gè)例子:

var num = ''
var str = '林三心'


var obj = { name: '林三心' }
obj = { name: '林胖子' }

上面這些num,str,obj就是就是使用者,我們都知道,JavaScript數(shù)據(jù)類型分為基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型:

  • 基礎(chǔ)數(shù)據(jù)類型:擁有固定的大小,值保存在棧內(nèi)存里,可以通過值直接訪問
  • 引用數(shù)據(jù)類型:大小不固定(可以加屬性),棧內(nèi)存中存著指針,指向堆內(nèi)存中的對(duì)象空間,通過引用來訪問

圖片圖片

  • 由于棧內(nèi)存所存的基礎(chǔ)數(shù)據(jù)類型大小是固定的,所以棧內(nèi)存的內(nèi)存都是操作系統(tǒng)自動(dòng)分配和釋放回收的
  • 由于堆內(nèi)存所存大小不固定,系統(tǒng)無法自動(dòng)釋放回收,所以需要JS引擎來手動(dòng)釋放這些內(nèi)存

為啥要垃圾回收

在Chrome中,V8被限制了內(nèi)存的使用(64位約1.4G/1464MB , 32位約0.7G/732MB),為什么要限制呢?

  • 表層原因:V8最初為瀏覽器而設(shè)計(jì),不太可能遇到用大量?jī)?nèi)存的場(chǎng)景
  • 深層原因:V8的垃圾回收機(jī)制的限制(如果清理大量的內(nèi)存垃圾是很耗時(shí)間,這樣會(huì)引起JavaScript線程暫停執(zhí)行的時(shí)間,那么性能和應(yīng)用直線下降)

前面說到棧內(nèi)的內(nèi)存,操作系統(tǒng)會(huì)自動(dòng)進(jìn)行內(nèi)存分配和內(nèi)存釋放,而堆中的內(nèi)存,由JS引擎(如Chrome的V8)手動(dòng)進(jìn)行釋放,當(dāng)我們的代碼沒有按照正確的寫法時(shí),會(huì)使得JS引擎的垃圾回收機(jī)制無法正確的對(duì)內(nèi)存進(jìn)行釋放(內(nèi)存泄露),從而使得瀏覽器占用的內(nèi)存不斷增加,進(jìn)而導(dǎo)致JavaScript和應(yīng)用、操作系統(tǒng)性能下降。

V8的垃圾回收算法

1. 分代回收

在JavaScript中,對(duì)象存活周期分為兩種情況

  • 存活周期很短:經(jīng)過一次垃圾回收后,就被釋放回收掉
  • 存活周期很長:經(jīng)過多次垃圾回收后,他還存在,賴著不走

那么問題來了,對(duì)于存活周期短的,回收掉就算了,但對(duì)于存活周期長的,多次回收都回收不掉,明知回收不掉,卻還不斷地去做回收無用功,那豈不是很消耗性能?

對(duì)于這個(gè)問題,V8做了分代回收的優(yōu)化方法,通俗點(diǎn)說就是:V8將堆分為兩個(gè)空間,一個(gè)叫新生代,一個(gè)叫老生代,新生代是存放存活周期短對(duì)象的地方,老生代是存放存活周期長對(duì)象的地方。

圖片圖片

新生代通常只有1-8M的容量,而老生代的容量就大很多了。對(duì)于這兩塊區(qū)域,V8分別使用了不同的垃圾回收器和不同的回收算法,以便更高效地實(shí)施垃圾回收。

  • 副垃圾回收器 + Scavenge算法:主要負(fù)責(zé)新生代的垃圾回收
  • 主垃圾回收器 + Mark-Sweep && Mark-Compact算法:主要負(fù)責(zé)老生代的垃圾回收

1.1 新生代

在JavaScript中,任何對(duì)象的聲明分配到的內(nèi)存,將會(huì)先被放置在新生代中,而因?yàn)榇蟛糠謱?duì)象在內(nèi)存中存活的周期很短,所以需要一個(gè)效率非常高的算法。在新生代中,主要使用Scavenge算法進(jìn)行垃圾回收,Scavenge算法是一個(gè)典型的犧牲空間換取時(shí)間的復(fù)制算法,在占用空間不大的場(chǎng)景上非常適用。

Scavange算法將新生代堆分為兩部分,分別叫from-space和to-space,工作方式也很簡(jiǎn)單,就是將from-space中存活的活動(dòng)對(duì)象復(fù)制到to-space中,并將這些對(duì)象的內(nèi)存有序的排列起來,然后將from-space中的非活動(dòng)對(duì)象的內(nèi)存進(jìn)行釋放,完成之后,將from space 和to space進(jìn)行互換,這樣可以使得新生代中的這兩塊區(qū)域可以重復(fù)利用。

圖片圖片

具體步驟為以下4步:

  • 標(biāo)記活動(dòng)對(duì)象和非活動(dòng)對(duì)象
  • 復(fù)制from-space的活動(dòng)對(duì)象到to-space中并進(jìn)行排序
  • 清除from-space中的非活動(dòng)對(duì)象
  • 將from-space和to-space進(jìn)行角色互換,以便下一次的Scavenge算法垃圾回收

那么,垃圾回收器是怎么知道哪些對(duì)象是活動(dòng)對(duì)象,哪些是非活動(dòng)對(duì)象呢?

這就要不得不提一個(gè)東西了——可達(dá)性。什么是可達(dá)性呢?就是從初始的根對(duì)象(window或者global)的指針開始,向下搜索子節(jié)點(diǎn),子節(jié)點(diǎn)被搜索到了,說明該子節(jié)點(diǎn)的引用對(duì)象可達(dá),并為其進(jìn)行標(biāo)記,然后接著遞歸搜索,直到所有子節(jié)點(diǎn)被遍歷結(jié)束。那么沒有被遍歷到節(jié)點(diǎn),也就沒有被標(biāo)記,也就會(huì)被當(dāng)成沒有被任何地方引用,就可以證明這是一個(gè)需要被釋放內(nèi)存的對(duì)象,可以被垃圾回收器回收。

新生代中的對(duì)象什么時(shí)候變成老生代的對(duì)象?

在新生代中,還進(jìn)一步進(jìn)行了細(xì)分。分為nursery子代和intermediate子代兩個(gè)區(qū)域,一個(gè)對(duì)象第一次分配內(nèi)存時(shí)會(huì)被分配到新生代中的nursery子代,如果經(jīng)過下一次垃圾回收這個(gè)對(duì)象還存在新生代中,這時(shí)候我們將此對(duì)象移動(dòng)到intermediate子代,在經(jīng)過下一次垃圾回收,如果這個(gè)對(duì)象還在新生代中,副垃圾回收器會(huì)將該對(duì)象移動(dòng)到老生代中,這個(gè)移動(dòng)的過程被稱為晉升

1.2 老生代

新生代空間的對(duì)象,身經(jīng)百戰(zhàn)之后,留下來的老對(duì)象,成功晉升到了老生代空間里,由于這些對(duì)象都是經(jīng)過多次回收過程但是沒有被回收走的,都是一群生命力頑強(qiáng),存活率高的對(duì)象,所以老生代里,回收算法不宜使用Scavenge算法,為啥呢,有以下原因:

  • Scavenge算法是復(fù)制算法,反復(fù)復(fù)制這些存活率高的對(duì)象,沒什么意義,效率極低。
  • Scavenge算法是以空間換時(shí)間的算法,老生代是內(nèi)存很大的空間,如果使用Scavenge算法,空間資源非常浪費(fèi),得不償失啊。

所以老生代里使用了Mark-Sweep算法(標(biāo)記清理)和Mark-Compact算法(標(biāo)記整理)。

Mark-Sweep(標(biāo)記清理)

Mark-Sweep分為兩個(gè)階段,標(biāo)記和清理階段,之前的Scavenge算法也有標(biāo)記和清理,但是Mark-Sweep算法跟Scavenge算法的區(qū)別是,后者需要復(fù)制后再清理,前者不需要,Mark-Sweep直接標(biāo)記活動(dòng)對(duì)象和非活動(dòng)對(duì)象之后,就直接執(zhí)行清理了。

  • 標(biāo)記階段:對(duì)老生代對(duì)象進(jìn)行第一次掃描,對(duì)活動(dòng)對(duì)象進(jìn)行標(biāo)記
  • 清理階段:對(duì)老生代對(duì)象進(jìn)行第二次掃描,清除未標(biāo)記的對(duì)象,即非活動(dòng)對(duì)象

圖片圖片

由上圖,我想大家也發(fā)現(xiàn)了,有一個(gè)問題:清除非活動(dòng)對(duì)象之后,留下了很多零零散散的空位。

Mark-Compact(標(biāo)記整理)

Mark-Sweep算法執(zhí)行垃圾回收之后,留下了很多零零散散的空位,這有什么壞處呢?如果此時(shí)進(jìn)來了一個(gè)大對(duì)象,需要對(duì)此對(duì)象分配一個(gè)大內(nèi)存,先從零零散散的空位中找位置,找了一圈,發(fā)現(xiàn)沒有適合自己大小的空位,只好拼在了最后,這個(gè)尋找空位的過程是耗性能的,這也是Mark-Sweep算法的一個(gè)缺點(diǎn)。

這個(gè)時(shí)候Mark-Compact算法出現(xiàn)了,他是Mark-Sweep算法的加強(qiáng)版,在Mark-Sweep算法的基礎(chǔ)上,加上了整理階段,每次清理完非活動(dòng)對(duì)象,就會(huì)把剩下的活動(dòng)對(duì)象,整理到內(nèi)存的一側(cè),整理完成后,直接回收掉邊界上的內(nèi)存。

圖片圖片

2. 全停頓(Stop-The-World)

說完V8的分代回收,咱們來聊聊一個(gè)問題。JS代碼的運(yùn)行要用到JS引擎,垃圾回收也要用到JS引擎,那如果這兩者同時(shí)進(jìn)行了,發(fā)生沖突了咋辦呢?答案是,垃圾回收優(yōu)先于代碼執(zhí)行,會(huì)先停止代碼的執(zhí)行,等到垃圾回收完畢,再執(zhí)行JS代碼。這個(gè)過程,稱為全停頓。

由于新生代空間小,并且存活對(duì)象少,再配合Scavenge算法,停頓時(shí)間較短。但是老生代就不一樣了,某些情況活動(dòng)對(duì)象比較多的時(shí)候,停頓時(shí)間就會(huì)較長,使得頁面出現(xiàn)了卡頓現(xiàn)象。

3. Orinoco優(yōu)化

orinoco為V8的垃圾回收器的項(xiàng)目代號(hào),為了提升用戶體驗(yàn),解決全停頓問題,它提出了增量標(biāo)記、懶性清理、并發(fā)、并行的優(yōu)化方法。

3.1 增量標(biāo)記(Incremental marking)

咱們前面不斷強(qiáng)調(diào)了先標(biāo)記,后清除,而增量標(biāo)記就是在標(biāo)記這個(gè)階段進(jìn)行了優(yōu)化。我舉個(gè)生動(dòng)的例子:路上有很多垃圾,害得路人都走不了路,需要清潔工打掃干凈才能走。前幾天路上的垃圾都比較少,所以路人們都等到清潔工全部清理干凈才通過,但是后幾天垃圾越來越多,清潔工清理的太久了,路人就等不及了,跟清潔工說:“你打掃一段,我就走一段,這樣效率高”。

大家把上面例子里,清潔工清理垃圾的過程——標(biāo)記過程,路人——JS代碼,一一對(duì)應(yīng)就懂了。當(dāng)垃圾少量時(shí)不會(huì)做增量標(biāo)記優(yōu)化,但是當(dāng)垃圾達(dá)到一定數(shù)量時(shí),增量標(biāo)記就會(huì)開啟:標(biāo)記一點(diǎn),JS代碼運(yùn)行一段,從而提高效率。

圖片圖片

3.2 惰性清理(Lazy sweeping)

上面說了,增量標(biāo)記只是針對(duì)標(biāo)記階段,而惰性清理就是針對(duì)清除階段了。在增量標(biāo)記之后,要進(jìn)行清理非活動(dòng)對(duì)象的時(shí)候,垃圾回收器發(fā)現(xiàn)了其實(shí)就算是不清理,剩余的空間也足以讓JS代碼跑起來,所以就延遲了清理,讓JS代碼先執(zhí)行,或者只清理部分垃圾,而不清理全部。這個(gè)優(yōu)化就叫做惰性清理。

整理標(biāo)記和惰性清理的出現(xiàn),大大改善了全停頓現(xiàn)象。但是問題也來了:增量標(biāo)記是標(biāo)記一點(diǎn),JS運(yùn)行一段,那如果你前腳剛標(biāo)記一個(gè)對(duì)象為活動(dòng)對(duì)象,后腳JS代碼就把此對(duì)象設(shè)置為非活動(dòng)對(duì)象,或者反過來,前腳沒有標(biāo)記一個(gè)對(duì)象為活動(dòng)對(duì)象,后腳JS代碼就把此對(duì)象設(shè)置為活動(dòng)對(duì)象。總結(jié)起來就是:標(biāo)記和代碼執(zhí)行的穿插,有可能造成對(duì)象引用改變,標(biāo)記錯(cuò)誤現(xiàn)象。這就需要使用寫屏障技術(shù)來記錄這些引用關(guān)系的變化。

3.3 并發(fā)(Concurrent)

并發(fā)式GC允許在在垃圾回收的同時(shí)不需要將主線程掛起,兩者可以同時(shí)進(jìn)行,只有在個(gè)別時(shí)候需要短暫停下來讓垃圾回收器做一些特殊的操作。但是這種方式也要面對(duì)增量回收的問題,就是在垃圾回收過程中,由于JavaScript代碼在執(zhí)行,堆中的對(duì)象的引用關(guān)系隨時(shí)可能會(huì)變化,所以也要進(jìn)行寫屏障操作。

圖片圖片

3.4 并行

并行式GC允許主線程和輔助線程同時(shí)執(zhí)行同樣的GC工作,這樣可以讓輔助線程來分擔(dān)主線程的GC工作,使得垃圾回收所耗費(fèi)的時(shí)間等于總時(shí)間除以參與的線程數(shù)量(加上一些同步開銷)。

圖片圖片

V8當(dāng)前的垃圾回收機(jī)制

2011年,V8應(yīng)用了增量標(biāo)記機(jī)制。直至2018年,Chrome64和Node.js V10啟動(dòng)并發(fā)標(biāo)記(Concurrent),同時(shí)在并發(fā)的基礎(chǔ)上添加并行(Parallel)技術(shù),使得垃圾回收時(shí)間大幅度縮短。

副垃圾回收器

V8在新生代垃圾回收中,使用并行(parallel)機(jī)制,在整理排序階段,也就是將活動(dòng)對(duì)象從from-to復(fù)制到space-to的時(shí)候,啟用多個(gè)輔助線程,并行的進(jìn)行整理。由于多個(gè)線程競(jìng)爭(zhēng)一個(gè)新生代的堆的內(nèi)存資源,可能出現(xiàn)有某個(gè)活動(dòng)對(duì)象被多個(gè)線程進(jìn)行復(fù)制操作的問題,為了解決這個(gè)問題,V8在第一個(gè)線程對(duì)活動(dòng)對(duì)象進(jìn)行復(fù)制并且復(fù)制完成后,都必須去維護(hù)復(fù)制這個(gè)活動(dòng)對(duì)象后的指針轉(zhuǎn)發(fā)地址,以便于其他協(xié)助線程可以找到該活動(dòng)對(duì)象后可以判斷該活動(dòng)對(duì)象是否已被復(fù)制。

圖片圖片

主垃圾回收器

V8在老生代垃圾回收中,如果堆中的內(nèi)存大小超過某個(gè)閾值之后,會(huì)啟用并發(fā)(Concurrent)標(biāo)記任務(wù)。每個(gè)輔助線程都會(huì)去追蹤每個(gè)標(biāo)記到的對(duì)象的指針以及對(duì)這個(gè)對(duì)象的引用,而在JavaScript代碼執(zhí)行時(shí)候,并發(fā)標(biāo)記也在后臺(tái)的輔助進(jìn)程中進(jìn)行,當(dāng)堆中的某個(gè)對(duì)象指針被JavaScript代碼修改的時(shí)候,寫入屏障(write barriers)技術(shù)會(huì)在輔助線程在進(jìn)行并發(fā)標(biāo)記的時(shí)候進(jìn)行追蹤。

當(dāng)并發(fā)標(biāo)記完成或者動(dòng)態(tài)分配的內(nèi)存到達(dá)極限的時(shí)候,主線程會(huì)執(zhí)行最終的快速標(biāo)記步驟,這個(gè)時(shí)候主線程會(huì)掛起,主線程會(huì)再一次的掃描根集以確保所有的對(duì)象都完成了標(biāo)記,由于輔助線程已經(jīng)標(biāo)記過活動(dòng)對(duì)象,主線程的本次掃描只是進(jìn)行check操作,確認(rèn)完成之后,某些輔助線程會(huì)進(jìn)行清理內(nèi)存操作,某些輔助進(jìn)程會(huì)進(jìn)行內(nèi)存整理操作,由于都是并發(fā)的,并不會(huì)影響主線程JavaScript代碼的執(zhí)行。

圖片圖片

結(jié)語

讀懂了這篇文章,下次面試官問你的時(shí)候,你就可以不用傻乎乎地說:“引用法和標(biāo)記法”。而是可以更全面地,更細(xì)致地征服面試官了。

責(zé)任編輯:武曉燕 來源: 前端之神
相關(guān)推薦

2023-02-28 07:56:07

V8內(nèi)存管理

2020-09-27 07:32:18

V8

2023-06-07 16:00:40

JavaScriptV8語言

2021-11-05 15:23:20

JVM回收算法

2017-03-03 09:26:48

PHP垃圾回收機(jī)制

2017-08-17 15:40:08

大數(shù)據(jù)Python垃圾回收機(jī)制

2010-09-25 15:33:19

JVM垃圾回收

2009-06-23 14:15:00

Java垃圾回收

2024-10-28 13:18:54

2010-09-16 15:10:24

JVM垃圾回收機(jī)制

2011-07-04 16:48:56

JAVA垃圾回收機(jī)制GC

2021-05-27 21:47:12

Python垃圾回收

2010-09-25 15:26:12

JVM垃圾回收

2015-06-04 09:38:39

Java垃圾回收機(jī)

2017-06-12 17:38:32

Python垃圾回收引用

2011-06-28 12:39:34

Java垃圾回收

2022-04-29 08:00:51

V8垃圾回收

2022-04-29 08:05:06

內(nèi)存堆外GC

2010-10-13 10:24:38

垃圾回收機(jī)制JVMJava

2009-12-09 17:28:34

PHP垃圾回收機(jī)制
點(diǎn)贊
收藏

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

色丁香久综合在线久综合在线观看| 老司机免费视频一区二区三区| 精品日本一线二线三线不卡| 国产极品在线视频| 国产高清视频免费最新在线| 精品一区二区日韩| 97视频在线观看成人| 亚洲最大成人综合网| 日韩成人视屏| 欧美伊人久久久久久久久影院| 欧美 另类 交| 欧美性孕妇孕交| 国产精品一区二区视频| 日本中文字幕久久看| 国产一区二区视频在线观看免费| 日韩有码一区| 日韩久久久精品| 欧美日韩大尺度| 超级碰碰不卡在线视频| 国产精品久久久久久亚洲毛片| 国产在线一区二区三区欧美| 一级做a爱片性色毛片| 国产日韩1区| 久久91亚洲精品中文字幕| 欧美偷拍一区二区三区| 久久草在线视频| 日韩精品最新网址| 爽爽爽在线观看| 中文字幕日本一区二区| 午夜日韩在线观看| 国产亚洲一区在线播放| 亚洲一区二区三区国产| 国产女人18水真多毛片18精品 | av一区二区三区免费观看| 亚洲第一色中文字幕| 久热成人在线视频| av资源中文在线| 欧美亚洲色图校园春色| 91麻豆产精品久久久久久 | 欧美黑人一级片| 成人av二区| 亚洲毛片在线看| 欧美一级片黄色| 亚洲乱码一区| 日韩欧美的一区| 九九热免费在线观看| 伊人久久高清| 在线一区二区三区四区五区| aa免费在线观看| 蜜桃视频在线观看免费视频| 亚洲成人免费视频| 18禁裸男晨勃露j毛免费观看| 国产1区在线| 亚洲精品免费视频| 蜜桃网站在线观看| 国内小视频在线看| 亚洲国产日日夜夜| 精品视频免费在线播放| 中文在线资源| 色又黄又爽网站www久久| 欧美成人xxxxx| 欧美xxx网站| 欧美最猛性xxxxx直播| 九热视频在线观看| 欧美视频精品| 欧美一区二区三区四区久久| 免费欧美一级片| 白白在线精品| 精品香蕉一区二区三区| 久久久久久久久久久国产精品| 亚洲区小说区| xx视频.9999.com| 久久国产高清视频| 欧美日本国产| 欧美一区二区三区四区在线| 午夜久久久久久久久久影院| 精品久久一区| 日韩中文av在线| 日本在线一级片| 亚洲人体偷拍| 国产精品草莓在线免费观看| 国产十六处破外女视频| 欧美久久一级| 欧美—级a级欧美特级ar全黄| www日韩精品| 日韩中文字幕区一区有砖一区| 国产精品扒开腿做爽爽爽男男 | 91精品欧美久久久久久动漫| 熟妇女人妻丰满少妇中文字幕| 9l亚洲国产成人精品一区二三| 亚洲精品电影在线| 成人做爰69片免网站| 97久久超碰| 亚洲精品天天看| 91免费公开视频| 妖精视频成人观看www| 国产精品久久激情| 亚洲精品国产av| 久草在线在线精品观看| 成人自拍爱视频| 久久久久国产精品嫩草影院| 懂色av中文一区二区三区| 精品无码久久久久久久动漫| 在线观看麻豆蜜桃| 午夜视黄欧洲亚洲| 制服丝袜中文字幕第一页| 久久免费视频66| www国产精品视频| 麻豆久久久久久久久久| 国内精品第一页| 欧美日韩一区二区视频在线| 日本中文字幕中出在线| 欧美日韩一本到| 国产亚洲无码精品| 亚洲天堂久久| 91在线观看免费观看| 久草视频在线看| 亚洲成人午夜影院| 三级网站免费看| 欧美一级精品| 欧美一级视频一区二区| 国产高清视频免费| 成人免费在线观看入口| 欧美少妇性生活视频| 久久精品色播| 欧美激情在线狂野欧美精品| 一区二区三区播放| 欧美激情在线看| av免费在线播放网站| 国产精品对白久久久久粗| 久久精品99国产精品酒店日本| 精品乱码一区内射人妻无码| 91蝌蚪porny成人天涯| 9色porny| 96sao在线精品免费视频| 久久精品国产一区二区电影| 18国产免费视频| 国产视频一区二区三区在线观看| 久久综合色视频| 久久综合另类图片小说| 国内精品久久久久久| 亚洲精品久久久久久无码色欲四季 | 欧美日韩的一区二区| 精品成人无码一区二区三区| 丝袜亚洲另类丝袜在线| 秋霞毛片久久久久久久久| 捆绑裸体绳奴bdsm亚洲| 国产精品一区二区女厕厕| 欧美乱大交xxxxx潮喷l头像| av在线不卡精品| 国产丝袜视频一区| 九九热在线视频播放| www.日韩精品| 欧美日韩性生活片| 色综合www| 啪一啪鲁一鲁2019在线视频| 日本成人一区| 91国产福利在线| 日本女人性生活视频| 久久av老司机精品网站导航| 中文字幕精品—区二区日日骚| 欧美成人家庭影院| 久久久精品欧美| www.日韩高清| 亚洲成人av中文| 久久久久亚洲av无码专区桃色| 鲁大师影院一区二区三区| 水蜜桃一区二区三区| 日韩三区四区| 久久99久久99精品免观看粉嫩| 亚洲国产精品久久久久久久| 精品久久久国产| 精品人妻无码一区二区三区换脸| 日本伊人色综合网| 综合久久国产| 国产成人精品福利| 国产成人亚洲精品| 欧美极品视频| 精品电影一区二区| 亚洲最大免费视频| 首页国产欧美久久| 9999在线观看| 精品国产乱子伦一区二区| 国产97在线视频| 最新黄网在线观看| 亚洲欧美日韩国产成人| 91麻豆成人精品国产免费网站| 一区2区3区在线看| 国产精品高清无码在线观看| 久久99精品国产91久久来源| 波多野结衣av一区二区全免费观看 | 亚洲18在线看污www麻豆| 黄色另类av| 天堂√在线观看一区二区| 日韩精品亚洲专区在线观看| 欧美亚洲第一页| 岛国成人毛片| 亚洲视频999| 亚洲男人天堂久久| 亚洲欧美自拍偷拍色图| 星空大象在线观看免费播放| 麻豆成人av在线| 天天夜碰日日摸日日澡性色av| 欧美精品momsxxx| 91国产丝袜在线放| 日韩精品免费观看视频| 97视频在线观看网址| 国产在线观看a视频| 亚洲精选在线观看| 亚洲爆乳无码一区二区三区| 欧美图区在线视频| 日本三级小视频| 亚洲一区在线观看免费| 狂野欧美性猛交| 91麻豆精品在线观看| 中文字幕在线视频一区二区| 日韩电影免费在线看| 国内精品在线观看视频| 亚洲天堂免费| 亚洲看片网站| 精品国产一区二区三区小蝌蚪| 国产精品入口免费| 精品三级国产| 成人日韩av在线| 精品美女一区| 国产精品wwww| 欧美成人免费电影| 欧美在线视频在线播放完整版免费观看| 高清免费电影在线观看| 日韩中文在线不卡| eeuss影院www在线观看| 亚洲人成伊人成综合网久久久| 成人午夜免费在线观看| 日韩欧美一区在线| 国产普通话bbwbbwbbw| 欧美人狂配大交3d怪物一区| 最近中文在线观看| 色国产综合视频| 国产91国语对白在线| 日韩欧美一区二区三区久久| 毛片视频网站在线观看| 夜夜嗨av一区二区三区中文字幕 | 午夜精品视频一区二区三区在线看| 日韩精品伦理第一区| 激情久久一区二区| 国产精欧美一区二区三区| 亚洲一区站长工具| 日本精品视频在线播放| 亚洲午夜天堂| 国产精品福利无圣光在线一区| 巨茎人妖videos另类| 国产不卡在线观看| 无人区在线高清完整免费版 一区二| 欧美一级电影久久| 欧美亚洲大片| 国产在线精品播放| 亚洲精品不卡在线观看| 成人av资源网| 欧美1区2区3区4区| 日本一区二区在线| 91麻豆精品国产91久久久平台| 免费在线观看污污视频| 欧美日韩a区| 国产精品无码av在线播放| 久久一区中文字幕| 亚洲 激情 在线| 国产一区二区h| 亚洲图片欧美另类| 国产午夜精品一区二区| 美女网站视频色| 一区二区三区资源| 黑人精品无码一区二区三区AV| 欧美在线观看你懂的| 国产精品伦一区二区三区| 欧美日韩中文在线观看| 国产一级片av| 91精品国产高清一区二区三区蜜臀| 精品国产亚洲av麻豆| 亚洲精品久久久久久久久久久久久| 蜜桃视频在线观看视频| www.日韩av.com| xxxcom在线观看| 国产精品久久久久久久久久小说| 国产一二在线播放| 欧美大胆在线视频| 九九色在线视频| 日韩免费在线观看视频| 国产aa精品| 看欧美日韩国产| 国产精品福利在线观看播放| 日产精品一线二线三线芒果| 99久久99久久精品国产片桃花| 久久亚洲国产成人精品无码区| 亚洲欧美清纯在线制服| а 天堂 在线| 久久精品视频网| 少妇按摩一区二区三区| 国产精品国产三级国产aⅴ原创| 国产亚洲欧美精品久久久www| 日本久久电影网| 性一交一乱一乱一视频| 一区二区亚洲精品国产| 24小时免费看片在线观看| 国产原创欧美精品| 国产乱码精品一区二区亚洲| 日本香蕉视频在线观看| 免费成人美女在线观看| 国产精品无码一区二区三| 亚洲欧洲色图综合| 午夜精品久久久久久久蜜桃| 精品免费日韩av| 精品176二区| 国产精品免费一区豆花| 日韩av不卡一区| 狠狠干视频网站| 影视先锋久久| 欧美日韩激情四射| 美国av一区二区| 51妺嘿嘿午夜福利| 天天综合天天做天天综合| 国产高清免费观看| 久久黄色av网站| 欧美电影在线观看网站| 欧美日韩免费观看一区| 亚洲国产91| 成人在线短视频| 亚洲欧美自拍偷拍色图| 国产偷人爽久久久久久老妇app| 日韩国产欧美精品一区二区三区| 丝袜综合欧美| 1卡2卡3卡精品视频| 99免费精品| 午夜精品久久久久久久99热影院| 国产日韩欧美不卡| 波多野结衣日韩| 亚洲系列中文字幕| 欧美www.| 日韩精品一区二区三区外面| 男人的天堂亚洲在线| 欧美多人猛交狂配| 日韩欧美国产成人| 色播色播色播色播色播在线| 欧美亚洲视频在线观看| 欧美美女黄色| www.浪潮av.com| 91麻豆精品在线观看| 国产精品第5页| 亚洲天堂久久av| 中文在线一区二区三区| 激情在线视频播放| 久久精品亚洲国产奇米99| 久久精品久久精品国产大片| 国产视频在线一区| 免费观看日韩av| 国产精品久久久久国产a级| 国产一级做a爱片久久毛片a| 国内揄拍国内精品久久| 欧美激情精品久久久久久变态 | 亚洲一区久久久| 高潮久久久久久久久久久久久久| a级免费在线观看| 99国产精品久| 中文字幕亚洲乱码熟女1区2区| 亚洲美女av网站| 99久久er| 2022中文字幕| 99久久亚洲一区二区三区青草| 黄色片中文字幕| 久久精品成人动漫| 国产三级精品三级在线观看国产| 国产h视频在线播放| 中文字幕不卡在线| 亚洲精品成人av久久| 欧美日韩一区二区三区四区| 超碰caoporn久久| 久久久免费看| 精久久久久久久久久久| 久久精品视频9| 亚洲人成电影网站色…| 国产一区二区三区视频在线 | 国产精品美女高潮无套| 欧美一区二区三区在线观看视频 | 亚洲精品a级片| 波多野结衣视频播放| 欧美亚洲禁片免费| 1区2区3区在线视频| 久久日韩精品| 国产在线不卡一卡二卡三卡四卡| 日本熟妇毛茸茸丰满| 伊人久久综合97精品| 国产精品极品国产中出| 中文字幕第80页| 亚洲成人激情自拍| 香蕉视频网站在线观看| 狠狠色综合一区二区| 黑人巨大精品欧美黑白配亚洲| 国产毛片aaa| 欧美国产日韩一区二区三区| 国产精品免费大片| 又大又长粗又爽又黄少妇视频|