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

Android GC原理探究

移動開發 Android
想寫一篇關于android GC的想法來源于追查一個魅族手機圖片滑動卡頓問題,由于不斷的GC導致的丟幀卡頓的問題讓我們想了很多方案去解決,所以就打算詳細的看看內存分配和GC的原理,為什么會不斷的GC,GC ALLOC和GC COCURRENT有什么區別,能不能想辦法擴大堆內存減少GC的頻次等等。

[[191646]]

前言

想寫一篇關于android GC的想法來源于追查一個魅族手機圖片滑動卡頓問題,由于不斷的GC導致的丟幀卡頓的問題讓我們想了很多方案去解決,所以就打算詳細的看看內存分配和GC的原理,為什么會不斷的GC,GC ALLOC和GC COCURRENT有什么區別,能不能想辦法擴大堆內存減少GC的頻次等等。

1、JVM內存回收機制

1.1 回收算法

標記回收算法(Mark and Sweep GC)

從”GC Roots”集合開始,將內存整個遍歷一次,保留所有可以被GC Roots直接或間接引用到的對象,而剩下的對象都當作垃圾對待并回收,這個算法需要中斷進程內其它組件的執行并且可能產生內存碎片

復制算法 (Copying)

將現有的內存空間分為兩快,每次只使用其中一塊,在垃圾回收時將正在使用的內存中的存活對象復制到未被使用的內存塊中,之后,清除正在使用的內存塊中的所有對象,交換兩個內存的角色,完成垃圾回收。

標記-壓縮算法 (Mark-Compact)

先需要從根節點開始對所有可達對象做一次標記,但之后,它并不簡單地清理未標記的對象,而是將所有的存活對象壓縮到內存的一端。之后,清理邊界外所有的空間。這種方法既避免了碎片的產生,又不需要兩塊相同的內存空間,因此,其性價比比較高。

分代

將所有的新建對象都放入稱為年輕代的內存區域,年輕代的特點是對象會很快回收,因此,在年輕代就選擇效率較高的復制算法。當一個對象經過幾次回收后依然存活,對象就會被放入稱為老生代的內存空間。對于新生代適用于復制算法,而對于老年代則采取標記-壓縮算法。

1.2 復制和標記-壓縮算法的區別

乍一看這兩個算法似乎并沒有多大的區別,都是標記了然后挪到另外的內存地址進行回收,那為什么不同的分代要使用不同的回收算法呢?

其實2者***的區別在于前者是用空間換時間后者則是用時間換空間。

前者的在工作的時候是不沒有獨立的“mark”與“copy”階段的,而是合在一起做一個動作,就叫scavenge(或evacuate,或者就叫copy)。也就是說,每發現一個這次收集中尚未訪問過的活對象就直接copy到新地方,同時設置forwarding pointer。這樣的工作方式就需要多一份空間。

后者在工作的時候則需要分別的mark與compact階段,mark階段用來發現并標記所有活的對象,然后compact階段才移動對象來達到compact的目的。如果compact方式是sliding compaction,則在mark之后就可以按順序一個個對象“滑動”到空間的某一側。因為已經先遍歷了整個空間里的對象圖,知道所有的活對象了,所以移動的時候就可以在同一個空間內而不需要多一份空間。

所以新生代的回收會更快一點,老年代的回收則會需要更長時間,同時壓縮階段是會暫停應用的,所以給我們應該盡量避免對象出現在老年代。

2、Dalvik虛擬機

2.1 java堆

Java堆實際上是由一個Active堆和一個Zygote堆組成的,其中,Zygote堆用來管理Zygote進程在啟動過程中預加載和創建的各種對象,而Active堆是在Zygote進程fork***個子進程之前創建的。以后啟動的所有應用程序進程是被Zygote進程fork出來的,并都持有一個自己的Dalvik虛擬機。在創建應用程序的過程中,Dalvik虛擬機采用COW策略復制Zygote進程的地址空間。

COW策略:一開始的時候(未復制Zygote進程的地址空間的時候),應用程序進程和Zygote進程共享了同一個用來分配對象的堆。當Zygote進程或者應用程序進程對該堆進行寫操作時,內核就會執行真正的拷貝操作,使得Zygote進程和應用程序進程分別擁有自己的一份拷貝,這就是所謂的COW。因為copy是十分耗時的,所以必須盡量避免copy或者盡量少的copy。

為了實現這個目的,當創建***個應用程序進程時,會將已經使用了的那部分堆內存劃分為一部分,還沒有使用的堆內存劃分為另外一部分。前者就稱為Zygote堆,后者就稱為Active堆。這樣只需把zygote堆中的內容復制給應用程序進程就可以了。以后無論是Zygote進程,還是應用程序進程,當它們需要分配對象的時候,都在Active堆上進行。這樣就可以使得Zygote堆盡可能少地被執行寫操作,因而就可以減少執行寫時拷貝的操作。在Zygote堆里面分配的對象其實主要就是Zygote進程在啟動過程中預加載的類、資源和對象了。這意味著這些預加載的類、資源和對象可以在Zygote進程和應用程序進程中做到長期共享。這樣既能減少拷貝操作,還能減少對內存的需求。

2.2 和GC有關的一些指標

記得我們之前在優化魅族某手機的gc卡頓問題時,發現他很容易觸發GC_FOR_MALLOC,這個GC類別后續會說到,是分配對象內存不足時導致的。可是我們又設置了很大的堆Size為什么還會內存不夠呢,這里需要了解以下幾個概念:分別是Java堆的起始大小(Starting Size)、***值(Maximum Size)和增長上限值(Growth Limit)。

在啟動Dalvik虛擬機的時候,我們可以分別通過-Xms、-Xmx和-XX:HeapGrowthLimit三個選項來指定上述三個值,以上三個值分別表示表示

  • Starting Size: Dalvik虛擬機啟動的時候,會先分配一塊初始的堆內存給虛擬機使用。
  • Growth Limit:是系統給每一個程序的***堆上限,超過這個上限,程序就會OOM
  • Maximum Size:不受控情況下的***堆內存大小,起始就是我們在用largeheap屬性的時候,可以從系統獲取的***堆大小

同時除了上面的這個三個指標外,還有幾個指標也是值得我們關注的,那就是堆最小空閑值(Min Free)、堆***空閑值(Max Free)和堆目標利用率(Target Utilization)。假設在某一次GC之后,存活對象占用內存的大小為LiveSize,那么這時候堆的理想大小應該為(LiveSize / U)。但是(LiveSize / U)必須大于等于(LiveSize + MinFree)并且小于等于(LiveSize + MaxFree),每次GC后垃圾回收器都會盡量讓堆的利用率往目標利用率靠攏。所以當我們嘗試手動去生成一些幾百K的對象,試圖去擴大可用堆大小的時候,反而會導致頻繁的GC,因為這些對象的分配會導致GC,而GC后會讓堆內存回到合適的比例,而我們使用的局部變量很快會被回收理論上存活對象還是那么多,我們的堆大小也會縮減回來無法達到擴充的目的。 與此同時這也是產生CONCURRENT GC的一個因素,后文我們會詳細講到。

2.3 GC的類型

  • GC_FOR_MALLOC: 表示是在堆上分配對象時內存不足觸發的GC。
  • GC_CONCURRENT: 當我們應用程序的堆內存達到一定量,或者可以理解為快要滿的時候,系統會自動觸發GC操作來釋放內存。
  • GC_EXPLICIT: 表示是應用程序調用System.gc、VMRuntime.gc接口或者收到SIGUSR1信號時觸發的GC。
  • GC_BEFORE_OOM: 表示是在準備拋OOM異常之前進行的***努力而觸發的GC。

實際上,GC_FOR_MALLOC、GC_CONCURRENT和GC_BEFORE_OOM三種類型的GC都是在分配對象的過程觸發的。而并發和非并發GC的區別主要在于前者在GC過程中,有條件地掛起和喚醒非GC線程,而后者在執行GC的過程中,一直都是掛起非GC線程的。并行GC通過有條件地掛起和喚醒非GC線程,就可以使得應用程序獲得更好的響應性。但是同時并行GC需要多執行一次標記根集對象以及遞歸標記那些在GC過程被訪問了的對象的操作,所以也需要花費更多的CPU資源。后文在Art的并發和非并發GC中我們也會著重說明下這兩者的區別。

2.4 對象的分配和GC觸發時機

  1. 調用函數dvmHeapSourceAlloc在Java堆上分配指定大小的內存。如果分配成功,那么就將分配得到的地址直接返回給調用者了。函數dvmHeapSourceAlloc在不改變Java堆當前大小的前提下進行內存分配,這是屬于輕量級的內存分配動作。
  2. 如果上一步內存分配失敗,這時候就需要執行一次GC了。不過如果GC線程已經在運行中,即gDvm.gcHeap->gcRunning的值等于true,那么就直接調用函數dvmWaitForConcurrentGcToComplete等到GC執行完成就是了。否則的話,就需要調用函數gcForMalloc來執行一次GC了,參數false表示不要回收軟引用對象引用的對象。
  3. GC執行完畢后,再次調用函數dvmHeapSourceAlloc嘗試輕量級的內存分配操作。如果分配成功,那么就將分配得到的地址直接返回給調用者了。
  4. 如果上一步內存分配失敗,這時候就得考慮先將Java堆的當前大小設置為Dalvik虛擬機啟動時指定的Java堆***值,再進行內存分配了。這是通過調用函數dvmHeapSourceAllocAndGrow來實現的。
  5. 如果調用函數dvmHeapSourceAllocAndGrow分配內存成功,則直接將分配得到的地址直接返回給調用者了。
  6. 如果上一步內存分配還是失敗,這時候就得出狠招了。再次調用函數gcForMalloc來執行GC。參數true表示要回收軟引用對象引用的對象。
  7. GC執行完畢,再次調用函數dvmHeapSourceAllocAndGrow進行內存分配。這是***一次努力了,成功與事都到此為止。

示例圖如下:

 

通過這個流程可以看到,在對象的分配中會導致GC,***次分配對象失敗我們會觸發GC但是不回收Soft的引用,如果再次分配還是失敗我們就會將Soft的內存也給回收,前者觸發的GC是GC_FOR_MALLOC類型的GC,后者是GC_BEFORE_OOM類型的GC。而當內存分配成功后,我們會判斷當前的內存占用是否是達到了GC_CONCURRENT的閥值,如果達到了那么又會觸發GC_CONCURRENT。

那么這個閥值又是如何來的呢,上面我們說到的一個目標利用率,GC后我們會記錄一個目標值,這個值理論上需要再上述的范圍之內,如果不在我們會選取邊界值做為目標值。虛擬機會記錄這個目標值,當做當前允許總的可以分配到的內存。同時根據目標值減去固定值(200~500K),當做觸發GC_CONCURRENT事件的閾值。

2.5 回收算法和內存碎片

主流的大部分Davik采取的都是標注與清理(Mark and Sweep)回收算法,也有實現了拷貝GC的,這一點和HotSpot是不一樣的,具體使用什么算法是在編譯期決定的,無法在運行的時候動態更換。如果在編譯dalvik虛擬機的命令中指明了”WITH_COPYING_GC”選項,則編譯”/dalvik/vm/alloc/Copying.cpp”源碼 – 此是Android中拷貝GC算法的實現,否則編譯”/dalvik/vm/alloc/HeapSource.cpp” – 其實現了標注與清理GC算法。

由于Mark and Sweep算法的缺點,容易導致內存碎片,所以在這個算法下,當我們有大量不連續小內存的時候,再分配一個較大對象時,還是會非常容易導致GC,比如我們在該手機上decode圖片,具體情況如下:

 

所以對于Dalvik虛擬機的手機來說,我們首先要盡量避免掉頻繁生成很多臨時小變量(比如說:getView,onDraw等函數),另一個又要盡量去避免產生很多長生命周期的大對象。

3、ART內存回收機制

3.1 Java堆

ART運行時內部使用的Java堆的主要組成包括Image Space、Zygote Space、Allocation Space和Large Object Space四個Space,Image Space用來存在一些預加載的類, Zygote Space和Allocation Space與Dalvik虛擬機垃圾收集機制中的Zygote堆和Active堆的作用是一樣的,

Large Object Space就是一些離散地址的集合,用來分配一些大對象從而提高了GC的管理效率和整體性能,類似如下圖:

 

在下文的GC Log中,我們也能看到在art的GC Log中包含了LOS的信息,方便我們查看大內存的情況。

3.2 GC的類型

  • kGcCauseForAlloc ,當要分配內存的時候發現內存不夠的情況下引起的GC,這種情況下的GC會stop world
  • kGcCauseBackground,當內存達到一定的閥值的時候會去出發GC,這個時候是一個后臺gc,不會引起stop world
  • kGcCauseExplicit,顯示調用的時候進行的gc,如果art打開了這個選項的情況下,在system.gc的時候會進行gc
  • 其他更多

3.3 對象的分配和GC觸發時機

由于Art下內存分配和Dalvik下基本沒有任何區別,我直接貼圖帶過了。

 

3.4 并發和非并發GC

Art在GC上不像Dalvik僅有一種回收算法,Art在不同的情況下會選擇不同的回收算法,比如Alloc內存不夠的時候會采用非并發GC,而在Alloc后發現內存達到一定閥值的時候又會觸發并發GC。同時在前后臺的情況下GC策略也不盡相同,后面我們會一一給大家說明。

非并發GC

步驟1. 調用子類實現的成員函數InitializePhase執行GC初始化階段。

步驟2. 掛起所有的ART運行時線程。

步驟3. 調用子類實現的成員函數MarkingPhase執行GC標記階段。

步驟4. 調用子類實現的成員函數ReclaimPhase執行GC回收階段。

步驟5. 恢復第2步掛起的ART運行時線程。

步驟6. 調用子類實現的成員函數FinishPhase執行GC結束階段。

并發GC

步驟1. 調用子類實現的成員函數InitializePhase執行GC初始化階段。

步驟2. 獲取用于訪問Java堆的鎖。

步驟3. 調用子類實現的成員函數MarkingPhase執行GC并行標記階段。

步驟4. 釋放用于訪問Java堆的鎖。

步驟5. 掛起所有的ART運行時線程。

步驟6. 調用子類實現的成員函數HandleDirtyObjectsPhase處理在GC并行標記階段被修改的對象。。

步驟7. 恢復第4步掛起的ART運行時線程。

步驟8. 重復第5到第7步,直到所有在GC并行階段被修改的對象都處理完成。

步驟9. 獲取用于訪問Java堆的鎖。

步驟10. 調用子類實現的成員函數ReclaimPhase執行GC回收階段。

步驟11. 釋放用于訪問Java堆的鎖。

步驟12. 調用子類實現的成員函數FinishPhase執行GC結束階段。

所以不論是并發還是非并發,都會引起stopworld的情況出現,并發的情況下單次stopworld的時間會更短,基本區別和。

3.***rt并發和Dalvik并發GC的差異

首先可以通過如下2張圖來對比下

Dalvik GC: 

 

Art GC:  

 

Art的并發GC和Dalvik的并發GC有什么區別呢,初看好像2者差不多,雖然沒有一直掛起線程,但是也會有暫停線程去執行標記對象的流程。通過閱讀相關文檔可以了解到Art并發GC對于Dalvik來說主要有三個優勢點:

      1. 標記自身

 Art在對象分配時會將新分配的對象壓入到Heap類的成員變量allocationstack描述的Allocation Stack中去,從而可以一定程度縮減對象遍歷范圍。

      2. 預讀取

 對于標記Allocation Stack的內存時,會預讀取接下來要遍歷的對象,同時再取出來該對象后又會將該對象引用的其他對象壓入棧中,直至遍歷完畢。

      3. 減少Pause時間

在Mark階段是不會Block其他線程的,這個階段會有臟數據,比如Mark發現不會使用的但是這個時候又被其他線程使用的數據,在Mark階段也會處理一些臟數據而不是留在***Block的時候再去處理,這樣也會減少后面Block階段對于臟數據的處理的時間。

3.6 前后臺GC

前臺Foreground指的就是應用程序在前臺運行時,而后臺Background就是應用程序在后臺運行時。因此,Foreground GC就是應用程序在前臺運行時執行的GC,而Background就是應用程序在后臺運行時執行的GC。

應用程序在前臺運行時,響應性是最重要的,因此也要求執行的GC是高效的。相反,應用程序在后臺運行時,響應性不是最重要的,這時候就適合用來解決堆的內存碎片問題。因此,Mark-Sweep GC適合作為Foreground GC,而Mark-Compact GC適合作為Background GC。

由于有Compact的能力存在,碎片化在Art上可以很好的被避免,這個也是Art一個很好的能力。

3.7 Art大法好

總的來看,art在gc上做的比dalvik好太多了,不光是gc的效率,減少pause時間,而且還在內存分配上對大內存的有單獨的分配區域,同時還能有算法在后臺做內存整理,減少內存碎片。對于開發者來說art下我們基本可以避免很多類似gc導致的卡頓問題了。另外根據谷歌自己的數據來看,Art相對Dalvik內存分配的效率提高了10倍,GC的效率提高了2-3倍。

4、GC Log

當我們想要根據GC日志來追查一些GC可能造成的卡頓時,我們需要了解GC日志的組成,不同信息代表了什么含義。

4.1 Dalvik GC日志

dalvik的日志格式基本如下:

  1. D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time>, <Total_time> 
  • gc_reason:就是我們上文提到的,是gc_alloc還是gc_concurrent,了解到不同的原因方便我們做不同的處理。
  • amount_freed:表示系統通過這次GC操作釋放了多少內存
  • Heap_stats:中會顯示當前內存的空閑比例以及使用情況(活動對象所占內存 / 當前程序總內存)
  • Pause_time:表示這次GC操作導致應用程序暫停的時間。關于這個暫停的時間,在2.3之前GC操作是不能并發進行的,也就是系統正在進行GC,那么應用程序就只能阻塞住等待GC結束。而自2.3之后,GC操作改成了并發的方式進行,就是說GC的過程中不會影響到應用程序的正常運行,但是在GC操作的開始和結束的時候會短暫阻塞一段時間,所以還有后續的一個total_time。
  • Total_time : 表示本次GC所花費的總時間和上面的Pause_time,也就是stop all是不一樣的,卡頓時間主要看上面的pause_time。

4.2 Art GC日志

  1. I/art: <GC_Reason> <Amount_freed>, <LOS_Space_Status>, <Heap_stats>, <Pause_time>, <Total_time> 

基本情況和Dalvik沒有什么差別,GC的Reason更多了,還多了一個OS_Space_Status

  • LOS_Space_Status:Large Object Space,大對象占用的空間,這部分內存并不是分配在堆上的,但仍屬于應用程序內存空間,主要用來管理 bitmap 等占內存大的對象,避免因分配大內存導致堆頻繁 GC。

寫在***:圖片來源自網絡,特別鳴謝老羅。 

責任編輯:龐桂玉 來源: 騰訊Bugly
相關推薦

2022-02-15 11:49:08

eBPFGo內存

2019-11-27 14:41:50

Java技術語言

2023-08-31 08:12:23

應用場景業務異常HTTP

2010-09-16 14:42:44

JVM

2014-04-02 17:10:00

虛擬應用工作原理

2021-10-27 16:52:37

LayoutInfl源碼解析

2019-01-10 08:24:06

2011-03-11 09:41:17

JavaGC

2010-09-15 15:59:11

CSS hack

2017-08-09 08:56:04

SP存儲Android

2010-09-29 14:54:34

J2MEHashtable

2024-12-17 08:28:30

2024-08-28 08:00:00

2019-09-02 14:53:53

JVM內存布局GC

2017-01-15 17:34:08

2022-10-30 15:00:50

2009-06-15 10:43:45

Java程序員Java程序GC

2022-01-25 09:15:39

V8垃圾回收算法

2023-05-08 14:56:00

Kafka高可靠高性能

2022-06-20 05:59:35

5G技術音視頻技術安卓系統
點贊
收藏

51CTO技術棧公眾號

国产成人a人亚洲精品无码| 少妇太紧太爽又黄又硬又爽小说| 色呦呦在线资源| 高清国产一区二区| 人人爽久久涩噜噜噜网站| 欧美激情亚洲色图| 精品久久国产一区| 精品美女国产在线| 亚洲一区二区三区欧美| 亚洲精品国产一区二| 久久国产66| 久久久国产精品免费| 久久久午夜精品福利内容| jizz欧美| 婷婷成人综合网| 一区二区不卡在线视频 午夜欧美不卡' | 中文字幕一区综合| 国产91绿帽单男绿奴| 日本不卡一区二区| 国外视频精品毛片| 日日碰狠狠添天天爽| 欧美日韩一区二区三区在线电影| 欧美男生操女生| 97国产精东麻豆人妻电影| 黄网页在线观看| 久久久蜜桃精品| av一区二区三区四区电影| 国产九色91回来了| 亚洲精品麻豆| 久久国产精品久久久久久| 无码人妻aⅴ一区二区三区69岛| 欧美第一在线视频| 欧美三级视频在线| 黄色免费视频大全| 污污的视频在线观看| 国产精品乱码一区二区三区软件| 欧美激情www| 亚洲国产精品18久久久久久| 精品一区二区三区免费毛片爱 | 四虎影视成人精品国库在线观看| 日韩欧美一区二区三区| 999在线观看视频| a天堂中文在线官网在线| 国产精品福利电影一区二区三区四区| 农村寡妇一区二区三区| 日韩欧美亚洲系列| av电影在线观看一区| av噜噜色噜噜久久| 亚洲成人77777| 国产福利91精品一区二区三区| 国产专区欧美专区| 中文字幕免费观看视频| 日韩国产精品久久| 国产精品极品尤物在线观看| 黄色片中文字幕| 久久av在线| 日本中文字幕成人| 国产伦精品一区二区三区视频我| 亚洲美女一区| 2020久久国产精品| 日本一区二区三区精品| 销魂美女一区二区三区视频在线| 91av视频在线免费观看| 国产污污视频在线观看| 国产农村妇女精品一二区| 2021国产精品视频| 无码人妻av一区二区三区波多野| 蜜桃av综合| 国产精品日韩一区| 一本久道久久综合无码中文| 九九国产精品视频| 亚洲最大福利视频网| 亚洲av综合色区无码一区爱av| 成人精品免费网站| 玖玖玖精品中文字幕| 男人的天堂av高清在线| 国产精品人成在线观看免费| 日本福利视频导航| 欧洲成人综合网| 精品久久久久久中文字幕一区奶水 | 电影av在线| 综合久久一区二区三区| 日韩视频一二三| 91九色美女在线视频| 日韩欧中文字幕| 午夜免费福利在线| 日韩高清在线观看一区二区| 精品国产网站在线观看| 亚洲av综合一区二区| 成人在线免费观看视频| 久久99精品久久久久久青青91| 日本三级午夜理伦三级三| 日韩专区中文字幕一区二区| 成人www视频在线观看| 精品国产99久久久久久宅男i| 成人一区在线看| 你懂的视频在线一区二区| 欧美激情办公室videoshd| 亚洲国产精品久久久久秋霞影院| 可以免费观看av毛片| 国产精品国产三级在线观看| 亚洲精品成人久久电影| 99精品中文字幕| 欧美色123| 国产精品99导航| 精品人妻无码一区二区色欲产成人 | 国产精品69久久久久| av男人天堂av| 久久久国产综合精品女国产盗摄| 超碰10000| 经典三级一区二区| 日韩三级.com| 黄色片网站在线播放| 夜久久久久久| 亚洲xxxxx性| 国产精品一区在线看| 亚洲国产精品影院| 中文字幕avav| 欧美亚洲国产精品久久| 久久免费视频在线观看| 99热这里只有精品5| 久久久久综合网| 草草草视频在线观看| 久久久加勒比| 亚洲久久久久久久久久| 日本网站免费观看| 国产一区二区在线观看视频| 日韩一本精品| 欧美13videosex性极品| 精品欧美乱码久久久久久 | 成人精品影院| 热久久美女精品天天吊色| 国 产 黄 色 大 片| 亚洲男人天堂一区| 少妇一级淫免费放| 精品成人影院| 欧美亚洲免费电影| 神马午夜在线观看| 亚洲一区视频在线| 超级砰砰砰97免费观看最新一期 | 亚洲精品视频免费在线观看| 久久一区二区三| 国产麻豆成人精品| 欧美精品一区二区性色a+v| 巨胸喷奶水www久久久免费动漫| 日韩精品在线免费观看视频| 日本网站在线免费观看| 成人免费高清在线| 成人性免费视频| 国产美女撒尿一区二区| 欧美激情一级精品国产| 国产情侣一区二区| 亚洲免费在线看| 黄色一级片免费播放| 亚洲乱码免费伦视频| 91中文字幕在线| а√中文在线8| 91精品国产91综合久久蜜臀| 四虎精品免费视频| 国产成人av影院| 国产精品www在线观看| 超碰97成人| 91精品国产91久久久久久最新| 天天综合网在线观看| 欧美性极品xxxx做受| 亚洲国产av一区| 蜜桃av一区二区在线观看| 亚洲a∨一区二区三区| 色综合视频一区二区三区日韩| 日韩在线观看免费高清| 国产夫妻自拍av| 亚洲一区二区三区四区中文字幕| 国产综合内射日韩久| 国产日韩综合| 亚洲精品乱码视频| 日本综合精品一区| 69视频在线免费观看| 黄色电影免费在线看| 欧美日韩国产系列| 久久久一区二区三区四区| 97超碰欧美中文字幕| 亚洲人成无码www久久久| 999国产精品视频| a级国产乱理论片在线观看99| caoporn视频在线| 亚洲一品av免费观看| 国产熟女一区二区三区五月婷| 亚洲国产日日夜夜| a天堂中文字幕| 久久福利视频一区二区| 欧美国产日韩激情| 国产成人调教视频在线观看| 成人乱色短篇合集| 极品在线视频| 久久精品国产精品| 天堂v视频永久在线播放| 欧美日韩国产另类不卡| www..com国产| 一区在线观看视频| 日本黄色录像片| 久久国产精品72免费观看| 免费无码不卡视频在线观看| 999国产精品视频| 美乳视频一区二区| 中文一区二区三区四区| 国产精品日韩一区| 中文不卡1区2区3区| 久久中文精品视频| 国内精品一区视频| 亚洲精品成人久久电影| 国产人妖一区二区三区| 色婷婷国产精品综合在线观看| 婷婷在线精品视频| 国产日本亚洲高清| 亚洲图片综合网| 国产一区二区91| 日本免费观看网站| aa国产精品| 男人添女荫道口女人有什么感觉| 日韩精品久久| 日本欧美色综合网站免费| 91久久精品无嫩草影院| 成人深夜直播免费观看| 五月激情久久| 欧美在线观看网址综合| 少妇视频在线| 久久国产精品偷| 一级毛片视频在线| 国产亚洲一区二区在线| 日本午夜在线| 日韩精品视频在线观看免费| 亚洲精品国产suv一区| 欧美久久久久久蜜桃| 探花国产精品一区二区| 日韩欧美国产成人| 91视频免费网址| 亚洲高清免费在线| 久久免费播放视频| 亚洲精品中文字幕乱码三区| 少妇视频一区二区| 日本一区二区成人| 少妇av片在线观看| 国产欧美日韩麻豆91| 91成年人网站| 久久综合九色综合97_久久久| 野战少妇38p| 丁香天五香天堂综合| 在线观看欧美一区二区| 国产精一区二区三区| 无码人妻一区二区三区在线视频| 久热成人在线视频| 伊人成人222| 久久99精品久久久久婷婷| 日本人69视频| 国内精品国产三级国产a久久| 国产无色aaa| 国产激情一区二区三区| 国产一级免费片| aaa亚洲精品| 99久久久久久久久久| 久久久久亚洲综合| 日韩av片在线| 中文字幕一区二区三区在线播放 | 一区二区三区在线视频播放| 69av视频在线| 亚洲成av人片www| 黄色一级片免费在线观看| 在线亚洲一区二区| 亚洲天堂狠狠干| 日韩欧美二区三区| 熟妇人妻系列aⅴ无码专区友真希| 日韩精品极品在线观看| 国产中文字幕在线观看| www.日韩视频| 黑人极品ⅴideos精品欧美棵| 7m精品福利视频导航| 欧美xxx性| 国产主播欧美精品| 国产suv精品一区| 日本福利专区在线观看| 欧美日韩精品一区视频| 99热这里只有精品5| 亚洲精品一线二线三线| 巨骚激情综合| 欧美成人精品影院| 鲁鲁在线中文| 91精品久久久久久久久久久久久| 视频一区在线| 欧美日韩一区二区三区在线视频| 青草国产精品| 国产乱人伦精品一区二区三区| 中文在线一区| 在线不卡一区二区三区| 99热这里都是精品| 国产又粗又长又黄的视频| 亚洲一区欧美一区| 怡红院男人的天堂| 亚洲精品mp4| 麻豆av在线免费看| 91av视频在线| 欧美一区一区| 天天好比中文综合网| 红桃视频国产一区| 在线观看亚洲色图| 93久久精品日日躁夜夜躁欧美| 羞羞在线观看视频| 91官网在线免费观看| 亚洲爆乳无码一区二区三区| 在线观看亚洲区| 看黄在线观看| 亚洲最大av网站| 欧美日中文字幕| 自拍日韩亚洲一区在线| 国产精品一区二区x88av| 欧美人妻一区二区三区| 五月天中文字幕一区二区| 一级片一区二区三区| 国产视频久久久| 成人国产电影在线观看| 亚洲va电影大全| 久久综合国产| 已婚少妇美妙人妻系列| 91在线免费播放| 免费毛片在线播放免费| 欧美精品色综合| aⅴ在线视频男人的天堂| 欧美在线一区二区视频| 加勒比色综合久久久久久久久| 樱空桃在线播放| 卡一卡二国产精品| 香蕉成人在线视频| 在线看一区二区| 久久久资源网| 欧美亚洲日本网站| 亚欧洲精品视频在线观看| 成人免费看片'免费看| 国产乱人伦精品一区二区在线观看 | 青草综合视频| 色综合久久88色综合天天提莫| 国产精品丝袜xxxxxxx| 国产精品手机在线观看| 亚洲国产美女搞黄色| 亚洲第一天堂在线观看| 欧美成人精品一区| 清纯唯美激情亚洲| 996这里只有精品| 岛国一区二区在线观看| 久久久久无码精品国产| 日韩一级大片在线| 青青草原国产在线| 国产经品一区二区| 亚洲美女少妇无套啪啪呻吟| 中文字幕一区三区久久女搜查官| 性久久久久久久久久久久| 亚洲国产精品国自产拍久久| 国产69精品99久久久久久宅男| 国产精品毛片av| 妞干网在线观看视频| 99re66热这里只有精品3直播| 在线观看亚洲欧美| 亚洲视频在线免费看| 91大神在线观看线路一区| 二级片在线观看| 国产成人精品免费看| 国产精品第72页| 亚洲欧美色婷婷| 成人亚洲综合| 国产日本欧美在线| 国产91丝袜在线观看| 日本污视频在线观看| 亚洲性生活视频| 先锋影音一区二区| 久久亚洲国产成人精品无码区| 99久久综合国产精品| 波多野结衣高清视频| 日韩视频免费在线| 亚洲三级av| 妺妺窝人体色www在线小说| 日本一区二区三区dvd视频在线| 国产一区二区三区成人| 久久久久一本一区二区青青蜜月 | 亚洲人成网站在线播放2019| 国产一区二区三区精品欧美日韩一区二区三区 | 精品综合久久久久久97| 欧美激情极品| 中文字幕第88页| 亚洲国产视频一区| 国产一级免费在线观看| 99re国产| 日韩av一二三| 国产亚洲欧美精品久久久久久| 亚洲人成在线观看网站高清| 国产一区二区三区黄网站| 欧美成人免费在线观看视频| 国产精品网站一区| 高h调教冰块play男男双性文| 国产精品亚洲一区二区三区| 国产一区美女| 男人晚上看的视频| 日韩av综合中文字幕|