日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

你对JVM三色标记的理解嘛?

發(fā)布時(shí)間:2024/4/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你对JVM三色标记的理解嘛? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊上方“朱小廝的博客”,選擇“設(shè)為星標(biāo)”

后臺(tái)回復(fù)"書",獲取

后臺(tái)回復(fù)“k8s”,可領(lǐng)取k8s資料

三色標(biāo)記法是一種垃圾回收法,它可以讓JVM不發(fā)生或僅短時(shí)間發(fā)生STW(Stop The World),從而達(dá)到清除JVM內(nèi)存垃圾的目的。JVM中的CMS、G1垃圾回收器所使用垃圾回收算法即為三色標(biāo)記法。

三色標(biāo)記算法思想

三色標(biāo)記法將對(duì)象的顏色分為了黑、灰、白,三種顏色。

白色:該對(duì)象沒有被標(biāo)記過。(對(duì)象垃圾)

灰色:該對(duì)象已經(jīng)被標(biāo)記過了,但該對(duì)象下的屬性沒有全被標(biāo)記完。(GC需要從此對(duì)象中去尋找垃圾)

黑色:該對(duì)象已經(jīng)被標(biāo)記過了,且該對(duì)象下的屬性也全部都被標(biāo)記過了。(程序所需要的對(duì)象)

img

算法流程

從我們main方法的根對(duì)象(JVM中稱為GC Root)開始沿著他們的對(duì)象向下查找,用黑灰白的規(guī)則,標(biāo)記出所有跟GC Root相連接的對(duì)象,掃描一遍結(jié)束后,一般需要進(jìn)行一次短暫的STW(Stop The World),再次進(jìn)行掃描,此時(shí)因?yàn)楹谏珜?duì)象的屬性都也已經(jīng)被標(biāo)記過了,所以只需找出灰色對(duì)象并順著繼續(xù)往下標(biāo)記(且因?yàn)榇蟛糠值臉?biāo)記工作已經(jīng)在第一次并發(fā)的時(shí)候發(fā)生了,所以灰色對(duì)象數(shù)量會(huì)很少,標(biāo)記時(shí)間也會(huì)短很多), 此時(shí)程序繼續(xù)執(zhí)行,GC線程掃描所有的內(nèi)存,找出掃描之后依舊被標(biāo)記為白色的對(duì)象(垃圾),清除。

具體流程:

  • 首先創(chuàng)建三個(gè)集合:白、灰、黑。

  • 將所有對(duì)象放入白色集合中。

  • 然后從根節(jié)點(diǎn)開始遍歷所有對(duì)象(注意這里并不遞歸遍歷),把遍歷到的對(duì)象從白色集合放入灰色集合。

  • 之后遍歷灰色集合,將灰色對(duì)象引用的對(duì)象從白色集合放入灰色集合,之后將此灰色對(duì)象放入黑色集合

  • 重復(fù) 4 直到灰色中無(wú)任何對(duì)象

  • 通過write-barrier檢測(cè)對(duì)象有變化,重復(fù)以上操作

  • 收集所有白色對(duì)象(垃圾)

  • 三色標(biāo)記存在問題

  • 浮動(dòng)垃圾:并發(fā)標(biāo)記的過程中,若一個(gè)已經(jīng)被標(biāo)記成黑色或者灰色的對(duì)象,突然變成了垃圾,由于不會(huì)再對(duì)黑色標(biāo)記過的對(duì)象重新掃描,所以不會(huì)被發(fā)現(xiàn),那么這個(gè)對(duì)象不是白色的但是不會(huì)被清除,重新標(biāo)記也不能從GC Root中去找到,所以成為了浮動(dòng)垃圾,浮動(dòng)垃圾對(duì)系統(tǒng)的影響不大,留給下一次GC進(jìn)行處理即可

  • 對(duì)象漏標(biāo)問題(需要的對(duì)象被回收):并發(fā)標(biāo)記的過程中,一個(gè)業(yè)務(wù)線程將一個(gè)未被掃描過的白色對(duì)象斷開引用成為垃圾(刪除引用),同時(shí)黑色對(duì)象引用了該對(duì)象(增加引用)(這兩部可以不分先后順序);因?yàn)楹谏珜?duì)象的含義為其屬性都已經(jīng)被標(biāo)記過了,重新標(biāo)記也不會(huì)從黑色對(duì)象中去找,導(dǎo)致該對(duì)象被程序所需要,卻又要被GC回收,此問題會(huì)導(dǎo)致系統(tǒng)出現(xiàn)問題,而CMS與G1,兩種回收器在使用三色標(biāo)記法時(shí),都采取了一些措施來應(yīng)對(duì)這些問題,CMS對(duì)增加引用環(huán)節(jié)進(jìn)行處理(Increment Update),G1則對(duì)刪除引用環(huán)節(jié)進(jìn)行處理(SATB)。

  • 解決辦法

    在JVM虛擬機(jī)中有兩種常見垃圾回收器使用了該算法:CMS(Concurrent Mark Sweep)、G1(Garbage First) ,為了解決三色標(biāo)記法對(duì)對(duì)象漏標(biāo)問題各自有各自的法:

    CMS回顧

    CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。目前很大一部分的Java應(yīng)用集中在互聯(lián)網(wǎng)網(wǎng)站或者基于瀏覽器的B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用通常都會(huì)較為關(guān)注服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時(shí)間盡可能短,以給用戶帶來良好的交互體驗(yàn)。CMS收集器就非常符合這類應(yīng)用的需求(但是實(shí)際由于某些問題,很少有使用CMS作為主要垃圾回收器的)。

    從名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于標(biāo)記-清除算法實(shí)現(xiàn)的,它的運(yùn)作過程相對(duì)于前面幾種收集器來說要更復(fù)雜一些,整個(gè)過程分為四個(gè)步驟,包括:1)初始標(biāo)記(CMS initial mark) 2)并發(fā)標(biāo)記(CMS concurrent mark) 3)重新標(biāo)記(CMS remark) 4)并發(fā)清除(CMS concurrent sweep)

    其中初始標(biāo)記、重新標(biāo)記這兩個(gè)步驟仍然需要“Stop The World”。初始標(biāo)記僅僅只是標(biāo)記一下GCRoots能直接關(guān)聯(lián)到的對(duì)象,速度很快;

    并發(fā)標(biāo)記階段就是從GC Roots的直接關(guān)聯(lián)對(duì)象開始遍歷整個(gè)對(duì)象圖的過程,這個(gè)過程耗時(shí)較長(zhǎng)但是不需要停頓用戶線程,可以與垃圾收集線程一起并發(fā)運(yùn)行;

    重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間,因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間通常會(huì)比初始標(biāo)記階段稍長(zhǎng)一些,但也遠(yuǎn)比并發(fā)標(biāo)記階段的時(shí)間短;

    最后是并發(fā)清除階段,清理刪除掉標(biāo)記階段判斷的已經(jīng)死亡的對(duì)象,由于不需要移動(dòng)存活對(duì)象,所以這個(gè)階段也是可以與用戶線程同時(shí)并發(fā)的。由于在整個(gè)過程中耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除階段中,垃圾收集器線程都可以與用戶線程一起工作,所以從總體上來說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)執(zhí)行的。

    img

    CMS解決辦法:增量更新

    在應(yīng)對(duì)漏標(biāo)問題時(shí),CMS使用了增量更新(Increment Update)方法來做:

    在一個(gè)未被標(biāo)記的對(duì)象(白色對(duì)象)被重新引用后,引用它的對(duì)象若為黑色則要變成灰色,在下次二次標(biāo)記時(shí)讓GC線程繼續(xù)標(biāo)記它的屬性對(duì)象

    但是就算是這樣,其仍然是存在漏標(biāo)的問題:

    • 在一個(gè)灰色對(duì)象正在被一個(gè)GC線程回收時(shí),當(dāng)它已經(jīng)被標(biāo)記過的屬性指向了一個(gè)白色對(duì)象(垃圾)

    • 而這個(gè)對(duì)象的屬性對(duì)象本身還未全部標(biāo)記結(jié)束,則為灰色不變

    • 而這個(gè)GC線程在標(biāo)記完最后一個(gè)屬性后,認(rèn)為已經(jīng)將所有的屬性標(biāo)記結(jié)束了,將這個(gè)灰色對(duì)象標(biāo)記為黑色,被重新引用的白色對(duì)象,無(wú)法被標(biāo)記

    CMS另兩個(gè)致命缺陷

  • CMS采用了Mark-Sweep算法,最后會(huì)產(chǎn)生許多內(nèi)存碎片,當(dāng)?shù)揭欢〝?shù)量時(shí),CMS無(wú)法清理這些碎片了,CMS會(huì)讓Serial Old垃圾處理器來清理這些垃圾碎片,而Serial Old垃圾處理器是單線程操作進(jìn)行清理垃圾的,效率很低。

    所以使用CMS就會(huì)出現(xiàn)一種情況,硬件升級(jí)了,卻越來越卡頓,其原因就是因?yàn)檫M(jìn)行Serial Old GC時(shí),效率過低。

    • 解決方案:使用Mark-Sweep-Compact算法,減少垃圾碎片

    • 調(diào)優(yōu)參數(shù)(配套使用):

      -XX:+UseCMSCompactAtFullCollection??開啟CMS的壓縮 -XX:CMSFullGCsBeforeCompaction?默認(rèn)為0,指經(jīng)過多少次CMS?FullGC才進(jìn)行壓縮

    當(dāng)JVM認(rèn)為內(nèi)存不夠,再使用CMS進(jìn)行并發(fā)清理內(nèi)存可能會(huì)發(fā)生OOM的問題,而不得不進(jìn)行Serial Old GC,Serial Old是單線程垃圾回收,效率低

    • 解決方案:降低觸發(fā)CMS GC的閾值,讓浮動(dòng)垃圾不那么容易占滿老年代

    • 調(diào)優(yōu)參數(shù):

      -XX:CMSInitiatingOccupancyFraction?92%?可以降低這個(gè)值,讓老年代占用率達(dá)到該值就進(jìn)行CMS?GC

    G1回顧

    G1(Garbage First)物理內(nèi)存不再分代,而是由一塊一塊的Region組成,但是邏輯分代仍然存在。G1不再堅(jiān)持固定大小以及固定數(shù)量的分代區(qū)域劃分,而是把連續(xù)的Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region),每一個(gè)Region都可以根據(jù)需要,扮演新生代的Eden空間、Survivor空間,或者老年代空間。收集器能夠?qū)Π缪莶煌巧腞egion采用不同的策略去處理,這樣無(wú)論是新創(chuàng)建的對(duì)象還是已經(jīng)存活了一段時(shí)間、熬過多次收集的舊對(duì)象都能獲取很好的收集效果。

    Region中還有一類特殊的Humongous區(qū)域,專門用來存儲(chǔ)大對(duì)象。G1認(rèn)為只要大小超過了一個(gè)Region容量一半的對(duì)象即可判定為大對(duì)象。每個(gè)Region的大小可以通過參數(shù)-XX:G1HeapRegionSize設(shè)定,取值范圍為1MB~32MB,且應(yīng)為2的N次冪。而對(duì)于那些超過了整個(gè)Region容量的超級(jí)大對(duì)象,將會(huì)被存放在N個(gè)連續(xù)的Humongous Region之中,G1的大多數(shù)行為都把Humongous Region作為老年代的一部分來進(jìn)行看待,如圖所示

    img

    G1前置知識(shí)

    Card Table(多種垃圾回收器均具備)

    • 由于在進(jìn)行YoungGC時(shí),我們?cè)谶M(jìn)行對(duì)一個(gè)對(duì)象是否被引用的過程,需要掃描整個(gè)Old區(qū),所以JVM設(shè)計(jì)了CardTable,將Old區(qū)分為一個(gè)一個(gè)Card,一個(gè)Card有多個(gè)對(duì)象;如果一個(gè)Card中的對(duì)象有引用指向Young區(qū),則將其標(biāo)記為Dirty Card,下次需要進(jìn)行YoungGC時(shí),只需要去掃描Dirty Card即可。

    • Card Table 在底層數(shù)據(jù)結(jié)構(gòu)以?Bit Map實(shí)現(xiàn)。

    RSet(Remembered Set)

    是輔助GC過程的一種結(jié)構(gòu),典型的空間換時(shí)間工具,和Card Table有些類似。

    后面說到的CSet(Collection Set)也是輔助GC的,它記錄了GC要收集的Region集合,集合里的Region可以是任意年代的。

    在GC的時(shí)候,對(duì)于old->young和old->old的跨代對(duì)象引用,只要掃描對(duì)應(yīng)的CSet中的RSet即可。邏輯上說每個(gè)Region都有一個(gè)RSet,RSet記錄了其他Region中的對(duì)象引用本Region中對(duì)象的關(guān)系,屬于points-into結(jié)構(gòu)(誰(shuí)引用了我的對(duì)象)。

    而Card Table則是一種points-out(我引用了誰(shuí)的對(duì)象)的結(jié)構(gòu),每個(gè)Card 覆蓋一定范圍的Heap(一般為512Bytes)。G1的RSet是在Card Table的基礎(chǔ)上實(shí)現(xiàn)的:每個(gè)Region會(huì)記錄下別的Region有指向自己的指針,并標(biāo)記這些指針分別在哪些Card的范圍內(nèi)。這個(gè)RSet其實(shí)是一個(gè)Hash Table,Key是別的Region的起始地址,Value是一個(gè)集合,里面的元素是Card Table的Index。每個(gè)Region中都有一個(gè)RSet,記錄其他Region到本Region的引用信息;使得垃圾回收器不需要掃描整個(gè)堆找到誰(shuí)引用當(dāng)前分區(qū)中的對(duì)象,只需要掃描RSet即可。

    CSet(Collection Set)

    一組可被回收的分區(qū)Region的集合, 是多個(gè)對(duì)象的集合內(nèi)存區(qū)域。

    新生代與老年代的比例

    5% - 60%,一般不使用手工指定,因?yàn)檫@是G1預(yù)測(cè)停頓時(shí)間的基準(zhǔn),這地方簡(jiǎn)要說明一下,G1可以指定一個(gè)預(yù)期的停頓時(shí)間,然后G1會(huì)根據(jù)你設(shè)定的時(shí)間來動(dòng)態(tài)調(diào)整年輕代的比例,例如時(shí)間長(zhǎng),就將年輕代比例調(diào)小,讓YGC盡早行。

    G1解決辦法:SATB

    SATB(Snapshot At The Beginning), 在應(yīng)對(duì)漏標(biāo)問題時(shí),G1使用了SATB方法來做,具體流程:

  • 在開始標(biāo)記的時(shí)候生成一個(gè)快照?qǐng)D標(biāo)記存活對(duì)象

  • 在一個(gè)引用斷開后,要將此引用推到GC的堆棧里,保證白色對(duì)象(垃圾)還能被GC線程掃描到(在**write barrier(寫屏障)**里把所有舊的引用所指向的對(duì)象都變成非白的)。

  • 配合Rset,去掃描哪些Region引用到當(dāng)前的白色對(duì)象,若沒有引用到當(dāng)前對(duì)象,則回收

  • SATB詳細(xì)流程

  • SATB是維持并發(fā)GC的一種手段。G1并發(fā)的基礎(chǔ)就是SATB。SATB可以理解成在GC開始之前對(duì)堆內(nèi)存里的對(duì)象做一次快照,此時(shí)活的對(duì)像就認(rèn)為是活的,從而開成一個(gè)對(duì)象圖。

  • 在GC收集的時(shí)候,新生代的對(duì)象也認(rèn)為是活的對(duì)象,除此之外其他不可達(dá)的對(duì)象都認(rèn)為是垃圾對(duì)象。

  • 如何找到在GC過程中分配的對(duì)象呢?每個(gè)region記錄著兩個(gè)top-at-mark-start(TAMS)指針,分別為prevTAMS和nextTAMS。在TAMS以上的對(duì)象就是新分配的,因而被視為隱式marked。

  • 通過這種方式我們就找到了在GC過程中新分配的對(duì)象,并把這些對(duì)象認(rèn)為是活的對(duì)象。

  • 解決了對(duì)象在GC過程中分配的問題,那么在GC過程中引用發(fā)生變化的問題怎么解決呢?

  • G1給出的解決辦法是通過Write Barrier。Write Barrier就是對(duì)引用字段進(jìn)行賦值做了額外處理。通過Write Barrier就可以了解到哪些引用對(duì)象發(fā)生了什么樣的變化。

  • mark的過程就是遍歷heap標(biāo)記live object的過程,采用的是三色標(biāo)記算法,這三種顏色為white(表示還未訪問到)、gray(訪問到但是它用到的引用還沒有完全掃描)、back(訪問到而且其用到的引用已經(jīng)完全掃描完)。

  • 整個(gè)三色標(biāo)記算法就是從GC roots出發(fā)遍歷heap,針對(duì)可達(dá)對(duì)象先標(biāo)記white為gray,然后再標(biāo)記gray為black;遍歷完成之后所有可達(dá)對(duì)象都是balck的,所有white都是可以回收的。

  • SATB僅僅對(duì)于在marking開始階段進(jìn)行“snapshot”(marked all reachable at mark start),但是concurrent的時(shí)候并發(fā)修改可能造成對(duì)象漏標(biāo)記。

  • 對(duì)black新引用了一個(gè)white對(duì)象,然后又從gray對(duì)象中刪除了對(duì)該white對(duì)象的引用,這樣會(huì)造成了該white對(duì)象漏標(biāo)記。

  • 對(duì)black新引用了一個(gè)white對(duì)象,然后從gray對(duì)象刪了一個(gè)引用該white對(duì)象的white對(duì)象,這樣也會(huì)造成了該white對(duì)象漏標(biāo)記。

  • 對(duì)black新引用了一個(gè)剛new出來的white對(duì)象,沒有其他gray對(duì)象引用該white對(duì)象,這樣也會(huì)造成了該white對(duì)象漏標(biāo)記。

  • SATB效率高于增量更新的原因?

    因?yàn)镾ATB在重新標(biāo)記環(huán)節(jié)只需要去重新掃描那些被推到堆棧中的引用,并配合Rset來判斷當(dāng)前對(duì)象是否被引用來進(jìn)行回收;

    并且在最后G1并不會(huì)選擇回收所有垃圾對(duì)象,而是根據(jù)Region的垃圾多少來判斷與預(yù)估回收價(jià)值(指回收的垃圾與回收的STW時(shí)間的一個(gè)預(yù)估值),將一個(gè)或者多個(gè)Region放到CSet中,最后將這些Region中的存活對(duì)象壓縮并復(fù)制到新的Region中,清空原來的Region。

    G1會(huì)不會(huì)進(jìn)行Full GC?

    會(huì),當(dāng)內(nèi)存滿了的時(shí)候就會(huì)進(jìn)行Full GC;且JDK10之前的Full GC,為單線程的,所以使用G1需要避免Full GC的產(chǎn)生。

    解決方案:

    • 加大內(nèi)存;

    • 提高CPU性能,加快GC回收速度,而對(duì)象增加速度趕不上回收速度,則Full GC可以避免;

    • 降低進(jìn)行Mixed GC觸發(fā)的閾值,讓Mixed GC提早發(fā)生(默認(rèn)45%)

    想知道更多?掃描下面的二維碼關(guān)注我后臺(tái)回復(fù)"技術(shù)",加入技術(shù)群 后臺(tái)回復(fù)“k8s”,可領(lǐng)取k8s資料【精彩推薦】
    • ClickHouse到底是什么?為什么如此牛逼!

    • 原來ElasticSearch還可以這么理解

    • 面試官:InnoDB中一棵B+樹可以存放多少行數(shù)據(jù)?

    • 架構(gòu)之道:分離業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)

    • 星巴克不使用兩階段提交

    • 面試官:Redis新版本開始引入多線程,談?wù)勀愕目捶?#xff1f;

    • 喜馬拉雅自研網(wǎng)關(guān)架構(gòu)演進(jìn)過程

    • 收藏:存儲(chǔ)知識(shí)全面總結(jié)

    • 微博千萬(wàn)級(jí)規(guī)模高性能高并發(fā)的網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)

    總結(jié)

    以上是生活随笔為你收集整理的你对JVM三色标记的理解嘛?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美性大战久久久久久久 | 亚洲国产成人精品久久久 | 国产欧美精品aaaaaa片 | 歪歪6080 | 欧美一级片在线免费观看 | 善良的公与媳hd中文字 | 亚洲视频久久久 | 国产精品国产三级国产三级人妇 | 亚洲色图制服丝袜 | 亚洲精品一级二级 | 国产97自拍 | 欧色图 | 色婷综合 | a级片久久 | 亚洲福利视频一区二区 | 国产精品探花在线观看 | 欧美成年人在线视频 | 国产r级在线| 在线免费观看黄网站 | 亚洲经典视频 | 国产aⅴ无码片毛片一级一区2 | 激情综合在线 | 成人免费网站www网站高清 | 午夜网站视频 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 日韩午夜在线视频 | 超碰cc| 男女日皮视频 | 日韩视频免费 | 亚洲系列在线观看 | 波多野结衣影院 | 精品成人无码久久久久久 | 草草在线视频 | 不用播放器av| 国产学生美女无遮拦高潮视频 | 国产精品成人一区 | 国产传媒精品 | 国产成人高清 | 国产精品女人精品久久久天天 | 在线高清观看免费 | 久久手机免费视频 | 午夜精品av | 欧美一级影院 | 欧美人成在线视频 | 男女在楼梯上高潮做啪啪 | 一女双乳被两男吸视频 | 7777奇米影视 | 日本在线视频一区二区三区 | 亚洲黄页网站 | 国产黄色网页 | 91国在线视频 | 97国产成人| 日日噜夜夜噜 | 好吊色一区二区三区 | 欧美伊人影院 | 久操网在线 | 免费成人av在线播放 | www.爱操 | 日本女人黄色片 | 4hu在线观看| 亚洲手机在线 | 双腿张开被9个男人调教 | 国产资源在线视频 | 国产欧美一区二区精品忘忧草 | 亚欧成人精品一区二区 | 国产精久久 | 毛片日本 | 国产毛片在线 | 内射无码专区久久亚洲 | 国产视频在线观看视频 | 91看片黄色 | 少妇在线观看 | 少妇精品久久久一区二区三区 | 欧美日韩国产精品综合 | 中国女人真人一级毛片 | 亚洲少妇15p| 亚洲丁香花色 | 91亚洲一区二区 | 99久久久国产精品免费蜜臀 | jizz亚洲女人高潮大叫 | 国产精品免费电影 | 九月婷婷色 | 成人黄色在线视频 | 日本护士取精xxxxxhd | 久久久成人精品 | 一级二级av| 国产老妇伦国产熟女老妇视频 | 两性视频久久 | 怡红院av亚洲一区二区三区h | 国产高清免费在线观看 | 污动漫网站| 男女猛烈无遮挡免费视频 | 关秀媚三级 | 久久精品69 | 日韩综合 | 污网站在线播放 | 一级黄色免费网站 | 日韩精品视频中文字幕 | 天天射寡妇射 |