精品欧美一区二区三区在线观看 _久久久久国色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)

一本到12不卡视频在线dvd| 91国内精品久久久| 色婷婷综合久久久久久| 精品国产999| 日韩精品一线二线三线| 国产乱淫a∨片免费观看| 亚洲韩日在线| 中文字幕欧美国内| 女同性αv亚洲女同志| www.com.cn成人| 国产乱码精品一区二区三| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久人妻无码一区二区| 婷婷在线观看视频| 久久精品国产999大香线蕉| 久久久久久成人精品| 亚洲性猛交xxxx乱大交| 亚洲高清在线一区| 在线观看日韩精品| 亚洲熟妇无码一区二区三区| 性做久久久久久久久久| 另类激情亚洲| 久久久久成人精品| 91狠狠综合久久久| 国产亚洲第一伦理第一区| 精品国产一区二区三区久久久蜜月| 久久久国产欧美| 国产51人人成人人人人爽色哟哟| 国产91精品在线观看| 国产精品日韩在线观看| 日韩一区二区视频在线| 欧美精品一线| 亚洲精品大尺度| 自拍偷拍一区二区三区四区| 欧美三级网站| 亚洲福利一区二区三区| 色婷婷777777仙踪林| 国产精品久久一区二区三区不卡| 91香蕉国产在线观看软件| 69堂成人精品视频免费| 亚洲天堂男人网| 小处雏高清一区二区三区| 日韩精品久久久久久福利| 日本少妇激三级做爰在线| 久久人体av| 色94色欧美sute亚洲线路一久 | 欧美一区二区三级| 激情五月俺来也| jvid一区二区三区| 欧美亚一区二区| 国产一区亚洲二区三区| 色偷偷色偷偷色偷偷在线视频| 一区二区三区成人| 国产一区二区三区色淫影院 | 99热播精品免费| 在线日韩av片| 天天干天天草天天| 欧美在线一级| 亚洲www啪成人一区二区麻豆| 久久av喷吹av高潮av| 精品欧美色视频网站在线观看| 国产精品剧情在线亚洲| 樱花www成人免费视频| 黄色视屏免费在线观看| 亚洲黄色免费电影| 大西瓜av在线| 中文字幕高清在线播放| 在线视频国内自拍亚洲视频| 自拍偷拍一区二区三区四区| 榴莲视频成人app| 亚洲精品在线网站| 丰满少妇一区二区三区| 欧美综合在线视频观看| 久久久av一区| 国产五月天婷婷| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 亚洲天堂中文字幕在线观看| 精品国产网站在线观看| 狠狠人妻久久久久久综合蜜桃| 中文字幕伦av一区二区邻居| 中文字幕精品久久久久| 麻豆明星ai换脸视频| 亚洲午夜一级| 国产精品久久久久久久久借妻 | 日本少妇激情视频| 久久精品1区| 91在线|亚洲| 欧美一区二区三区黄片| 精品一区二区三区久久| 91原创国产| 国产在线免费观看| 亚洲美女在线国产| 日本在线视频www| 国产日韩一区二区三免费高清| 欧美精品一区二区三区蜜桃视频| 91激情视频在线观看| 91精品久久久久久久久久不卡| 久久人人爽国产| 欧美日韩大片在线观看| 亚洲一区二区动漫| 91精品在线国产| 亚州av在线播放| 亚洲欧美日韩国产综合| 亚洲日本japanese丝袜| 国产三级在线免费| 亚洲综合自拍偷拍| 538在线视频观看| 成午夜精品一区二区三区软件| 亚洲丝袜一区在线| 国产午夜视频在线播放| 麻豆精品一区二区三区| 国内成+人亚洲| av网站网址在线观看| 日韩欧美一区二区在线| 91丨porny丨九色| 国产精品一区二区三区四区五区| 在线观看国产原创自拍视频| 岛国av午夜精品| 国产精品91av| 99久久久久| 国产精品99久久99久久久二8| 无码一区二区三区在线观看| 国产成人精品免费| 最新国产精品久久| 欧美电影h版| 亚洲精品国产品国语在线| 91日韩中文字幕| 欧美久色视频| 成人福利视频在线观看| 久久精品蜜桃| 欧美性高潮床叫视频| 亚洲一区和二区| 欧美激情日韩| 91精品视频免费观看| 9191在线观看| 在线观看日产精品| 日韩av在线看免费观看| 国产欧美一级| 久久波多野结衣| 国产99在线| 欧美中文字幕一二三区视频| av直播在线观看| 夜久久久久久| 精品国产乱码久久久久久108| 男女免费观看在线爽爽爽视频| 91精品福利在线一区二区三区| 男人晚上看的视频| 卡一卡二国产精品 | 成人在线直播| 91精品国产高清一区二区三区 | 永久91嫩草亚洲精品人人| 成人精品视频99在线观看免费| 免费在线看黄网站| 欧美日韩大陆一区二区| 可以免费看av的网址| 久久精品国产精品亚洲红杏 | 国产欧美在线| 久久精品美女| 91p九色成人| 久久久精品在线观看| 国产色视频在线| 一区二区三区 在线观看视频| www.555国产精品免费| 9色精品在线| 日韩不卡av| 深夜日韩欧美| 欧美国产日韩一区二区三区| 手机在线观看免费av| 欧美日韩性视频在线| a天堂中文字幕| 韩国av一区二区三区四区| 日本黄大片在线观看| 色狼人综合干| 国产日韩欧美视频在线| 亚洲按摩av| 在线免费亚洲电影| 人人干在线观看| 丁香另类激情小说| 狠狠爱免费视频| 午夜久久av| 69**夜色精品国产69乱| 国产1区2区3区在线| 日韩视频在线你懂得| 久久久久亚洲av成人毛片韩| 国产精品理论片| 岛国大片在线免费观看| 香蕉久久久久久久av网站| 亚洲一区二区三区免费观看| 高潮久久久久久久久久久久久久| 热久久美女精品天天吊色| 免费av在线| 亚洲成人免费网站| 一区二区精品视频在线观看| 亚洲成a人片在线不卡一二三区| 人妻av无码一区二区三区| 国产成人精品免费在线| 激情内射人妻1区2区3区| 亚洲永久精品唐人导航网址| 91精品久久久久久久久久久| 国产伦子伦对白在线播放观看| 在线成人一区二区| 日本欧美www| 亚洲国产毛片aaaaa无费看| 亚洲av毛片基地| 日韩av中文字幕一区二区三区| 91视频成人免费| 欧美中文字幕一区二区| 国产日韩欧美综合精品| 999久久久国产999久久久| 青青a在线精品免费观看| 精品精品导航| 日韩在线观看成人| 美国成人毛片| 日韩成人在线观看| 性猛交xxxx乱大交孕妇印度| 亚洲综合免费观看高清完整版| 国产真实乱人偷精品人妻| 成人永久看片免费视频天堂| 日韩va在线观看| 日韩黄色在线观看| 国产精品97在线| 亚洲三级色网| 日本一本中文字幕| 最新国产精品久久久| 伊人久久大香线蕉午夜av| 欧洲杯什么时候开赛| 免费av一区二区三区| 国产成人福利av| 国产成人精品免费视频大全最热| 午夜不卡一区| 国产欧美在线观看| 国产精品美女午夜爽爽| 国产97色在线| 肉色欧美久久久久久久免费看| 7777免费精品视频| 高潮在线视频| 97视频在线免费观看| 国产白丝在线观看| 欧美福利在线观看| 日韩av激情| 久久久久久久久久久av| 久草在线视频网站| 欧美极品少妇xxxxⅹ喷水| 七七久久电影网| 欧美华人在线视频| 欧美黑人xx片| 久久人人看视频| 美女在线视频免费| 日本欧美中文字幕| 日韩影片中文字幕| 国产日韩欧美在线看| 成人在线视频国产| 2022国产精品| 国产精品sss在线观看av| 国产在线精品一区二区三区》| 精品国内亚洲2022精品成人| 黄色一区三区| 精品国产91| 宅男av一区二区三区| 91精品国产自产在线观看永久∴ | 九九九九精品| 猛男gaygay欧美视频| 日韩精品电影网站| 国产精品x453.com| 亚洲国产精品无码av| 欧美亚洲一级| 午夜视频在线网站| 高清不卡一二三区| www在线观看免费视频| 国产精品久久久一本精品| 免费国产羞羞网站美图| 午夜一区二区三区在线观看| 免费的毛片视频| 欧美美女一区二区在线观看| www.五月激情| 亚洲美女中文字幕| 性欧美一区二区三区| 亚洲国产美女久久久久| 男女污污视频在线观看| 日韩一二三在线视频播| xxx.xxx欧美| 国产精品视频yy9099| 日韩中文字幕无砖| 欧美日韩国产精品一卡| 一区二区三区在线观看免费| 久久久999免费视频| 秋霞电影网一区二区| 三级4级全黄60分钟| 韩国欧美国产1区| 日本护士做爰视频| ●精品国产综合乱码久久久久| 国产中文字字幕乱码无限| 欧美制服丝袜第一页| 精品人妻少妇AV无码专区| 亚洲欧美日韩精品久久奇米色影视 | 色诱女教师一区二区三区| 国产在线xxx| 国产日韩欧美黄色| 免费电影一区二区三区| 国产一二三四区在线观看| 日韩成人av影视| a天堂视频在线观看| 粉嫩一区二区三区在线看| 无码一区二区三区在线| 亚洲国产视频一区| 一级淫片免费看| 亚洲偷欧美偷国内偷| 丁香花电影在线观看完整版| 国产一区二区在线免费视频| 男男gay无套免费视频欧美| 日韩成人手机在线| 精品一区二区在线观看| 自拍偷拍视频亚洲| 午夜精品久久久久久久99水蜜桃| 国产美女永久免费| 一区二区在线视频播放| 性xxxxfreexxxxx欧美丶| 国产传媒一区二区| 欧美一区激情| 欧美xxxxxbbbbb| 中文字幕一区二区三区在线播放 | 日韩经典中文字幕一区| 在线精品一区二区三区| 亚洲一区二区欧美激情| 国产三级小视频| 久久韩剧网电视剧| 国模私拍国内精品国内av| 欧美主播一区二区三区美女 久久精品人| 亚洲免费高清| www.啪啪.com| 亚洲韩国精品一区| 亚洲成a人片77777精品| 欧美人与性动交| 岛国在线视频网站| 国产精品一码二码三码在线| 欧美二区视频| 在线观看你懂的视频| 亚洲色图19p| 99精品免费观看| 欧美精品免费在线观看| 日本三级一区| 久久一区二区精品| 亚洲一区日韩| 精品无人区无码乱码毛片国产 | 欧美精品免费在线观看| 日本在线成人| 成人精品视频在线播放| 成人免费视频视频| 国产又爽又黄的视频| 亚洲伦理中文字幕| 无人区在线高清完整免费版 一区二| 日韩精品久久久| 麻豆91在线看| 黄视频网站免费看| 精品国产一区久久| 激情黄产视频在线免费观看| 免费毛片一区二区三区久久久| 三级影片在线观看欧美日韩一区二区| 久久久久久久久久久久| 欧美吞精做爰啪啪高潮| 免费网站看v片在线a| y111111国产精品久久婷婷| 亚洲国产专区校园欧美| 国产精品天天干| 欧美久久久久久蜜桃| 欧美草逼视频| 欧美一区观看| 激情偷乱视频一区二区三区| 欧美黄色免费观看| 国产视频久久久| 久久精品97| 欧美成人精品免费| 国产午夜精品久久| 国产av无码专区亚洲av麻豆| 国产一区二区欧美日韩| 亚洲我射av| 欧美深夜福利视频| 欧美国产一区视频在线观看| 国产夫妻性生活视频| 欧美亚洲午夜视频在线观看| 伊人精品久久| 六月激情综合网| 亚洲视频 欧洲视频| 少妇人妻偷人精品一区二区| 国产精品久在线观看| 牛牛国产精品| 成年人网站免费在线观看| 欧美美女喷水视频| sm在线观看| 亚洲精品白虎| 99re视频精品| 日韩三级一区二区三区| 中文字幕亚洲欧美在线| 给我免费播放日韩视频| 亚洲一级片免费| 亚洲成人精品一区| 免费av网站在线观看| 蜜桃免费一区二区三区| 国产不卡一区视频| 在线观看xxxx|