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

Full GC 頻率優化實戰

開發
本文介紹了游戲業務使用MAT和GC日志等工具對 Full GC頻率進行優化的過程。

一、背景

圖片

圖片

游戲業務面對用戶端的某個工程,每天Full GC頻率達到120次,業務高峰期每7分鐘就會有一次Full GC。為了避免情況持續變差,最大程度減少對系統響應時間的負面影響,需要對該工程的Full GC頻率進行優化。

該項目JDK版本為1.8,老年代使用CMS作為垃圾回收器,優化前的部分啟動參數如下:

-Xms4608M -Xmx4608M -Xmn2048M -XX:MetaspaceSize=320M -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFractinotallow=92 -XX:+UseCMSInitiatingOccupancyOnly

二、工具介紹

在本次優化過程中,我們主要使用了MAT和GC日志作為排查工具。MAT是一個功能強大的內存分析工具,而GC日志則用于記錄Java虛擬機中的垃圾回收行為和內存情況。這兩者結合起來,能夠幫助開發人員深入分析程序的內存使用情況,并進行相應的優化。下文將詳細的介紹這兩種工具的使用方法,以及對應的優化案例。

2.1 MAT(Memory Analyzer Tool)

Eclipse Memory Analyzer Tool(MAT)是一個開源的Java堆轉儲分析工具。它旨在幫助開發人員識別和消除Java堆中的內存泄漏和優化內存使用。MAT允許用戶分析Java堆轉儲文件,識別對象的內存占用情況,查找潛在的內存泄漏和冗余對象,以便執行一些內存優化。

使用MAT打開dump文件后,首先進入的是上圖頁面,此頁面會顯示dump包的縮略概覽信息,包括堆大小,類數量,對象數量等信息。其中的Biggest Objects By Retained Size和Leak Suspects在問題明顯時會比較有用,但對相對復雜的問題來說幫助不大。筆者比較常用的是下面這幾個功能,下文將依次介紹:

2.1.1 Dominator Tree

(1)功能

展示對象的支配關系。對象A支配對象B代表從GC Root(也不一定是GC ROOT,也可以是unreachable的起點)達到對象B的所有路徑都必須經過對象A,這也意味著對象A被垃圾回收后,對象B也會被回收。

這個功能相較于下面的Histogram更強調對象的引用關系,此外還可以通過Group By Class/Group By Package/Group By ClassLoader來進一步的聚合對象。

MAT的各種圖標中會頻繁的出現Shallow Heap Size和Retained Heap Size這兩個名詞,其含義如下:

  • Shallow Heap Size:這個對象自身在堆中的大小
  • Retained Heap Size:這個對象被垃圾回收后會釋放的堆內存大小

上圖中,情況1里對象A的Retained Heap Size = A的Shallow Heap Size + B的Shallow Heap Size +C的Shallow Heap Size,情況2里對象A的Retained Heap Size = A的Shallow Heap Size + B的Shallow Heap Size。

(2)使用方法

①上圖為Group By Class的dominator tree。剛打開dominator tree時默認是不進行group的,此時可以排查單個大對象,排查完單個大對象后,需要將對象Group一下才能進行下一步的排查。

② 從上圖可以看出,這個堆內的對象內存占用比較分散,說明導致問題的原因可能不止一個,這種情況下只能結合自身業務逐個排查內存占用排在前面的對象。

③ 對這些可疑的對象,右鍵類,選擇List objects → with outgoing references展開對象列表,查看這類對象具體存了什么,判斷這些對象的值是否可以再分類。

④ 根據對象的值,判斷對象的業務含義,確定是哪段代碼創建的對象。

⑤ 結合代碼,思考這類對象是在新生代還是老年代,如果能確定都在新生代,那這些對象一般不會導致老年代快速增長。

⑥如果在老年代,需要確定其是怎么從新生代晉升的,內存占用是否有上限,上限是多少,一般多長時間能達到上限,再確定有沒有問題。

2.1.2 Histogram

功能

histogram可以顯示出各類對象的Shallow Heap Size和Retained Heap Size,Retained Heap Size默認不展示,需要點擊菜單欄的Calculate Retained Size進行計算,堆較大時計算耗時較長。

這張表一般和Dominator Tree結合使用,我們能看到char[]占用了較大的內存,但由于Dominator Tree里聚合好的char[]都是頂層支配者,上層不會再有引用,有時無法直接確定這些對象曾經被誰持有過,這時可以通過Histogram查看同類對象,找到相似的并且reachable的對象來確定這類對象是誰創建的。但是這一步其實可以通過oql解決,所以這張表在排查過程中的使用率其實沒有Histogram高。

2.1.3 OQL

功能

MAT提供的一種類似SQL的查詢語句,可以對對象進行過濾。這篇官方文章里給了很多查詢語句樣例:https://wiki.eclipse.org/MemoryAnalyzer/OQL,這里就簡單列一些筆者排查過程中用過的語句,不再贅述:

// 字符串模糊匹配
SELECT * FROM char[] b where toString(b) LIKE ".*traceId.*"
// 查找地址>0x700000000的對象
SELECT * FROM java.lang.Object t WHERE  toHex(t.@objectAddress) >= "0x700000000"
// 查找長度等于73并且retained heap size>1000B 的對象
SELECT * FROM java.lang.Object[] a where a.@length=73 and a.@retainedHeapSize>1000
// 查找長度等于65536并且上層有引用的對象
SELECT * FROM char[] a where a.@length=65536 and (inbounds(a).size()>0)

2.2 GC日志

GC日志是記錄Java虛擬機中垃圾回收活動的日志文件。在GC日志中,可以看到包括垃圾回收的時間、類型(如新生代GC、老年代GC等)、回收周期、回收停頓時間、回收前后堆的使用情況等信息。GC日志打印的信息可以通過以下啟動項控制:


三、 案例介紹

在這篇文章中,我們將聚焦于一些具體的案例,涉及到大量被Dubbo的FutureAdapter引用的對象、Jackson的BufferRecycler導致的大量char[65536]以及對象晉升年齡閾值過小等問題。通過這些案例,我們將探討這些具體問題的引起原因以及解決方案。

3.1 大量被Dubbo的FutureAdapter引用的對象

(1)分析過程

從上圖中,我們可以看到dubbo FutureAdapter占用了230M左右的內存,前面的PSWMS對象雖然也占用了230M左右的內存,但這是業務使用的本地緩存相關對象,其內存占用是在預期范圍內的,因此優先分析FutureAdapter。先右鍵List objects→with outgoing references展開對象列表。

發現其中有大量大小幾乎一致的FutureAdapter,一個占用內存328KB左右,大小和內容幾乎一致的對象約有550多個,總共占用內存200M左右。

FutureAdapter被用來執行Dubbo的異步調用,項目使用的dubbo版本為2.7.18。dubbo的同步調用本質上是一個異步轉同步的過程,發起異步調用將CompletableFuture對象放到ThreadLocal的FutureContext里,然后立刻調用CompletableFuture.get方法阻塞獲取返回值,獲取到返回值后,dubbo不會主動清理FutureContext,因此該線程的ThreadLocal里會有一條FutureContext→ FutureAdapter→Result的引用,如下圖:

然而,那550多個FutureAdapter均為不可達對象,意味著其不被ThreadLocal引用,在下次GC時會被回收,不過我們無法直接確定這些對象是在老年代還是新生代,有可能這些對象都在新生代,下次young gc時就會被回收,不會晉升到老年代,更不會導致老年代增長。

但由于這個列表里的數據有明確的業務含義,可以找到對應的業務接口,此接口單機峰值qps約為2,響應時間約100ms,每被調用一次,就會創建一個該對象列表,此時該機器的young gc頻率約為10s一次。假設這些對象都在新生代沒有晉升老年代,那么這些對象在新生代最大的存活數量約為((接口響應時間 + 兩次young gc間隔) * 對象創建速度) = (0.1s + 10s) * 2 ≈ 20,而堆里有550多個,如果這些對象沒有晉升到老年代的話數量上對不上,所以可以推測出這些對象在老年代里,需要等下次Full GC時才會被回收。

那么這些不可達的FutureAdapter為什么會在老年代?每次執行dubbo調用,dubbo都會用這次調用的FutureAdapter替換掉上次調用時存在FutureContext里的FutureAdapter,上次調用的FutureAdapter不再被GC Root引用,在下次GC時被回收。當一個線程相對頻繁的執行dubbo調用時,FutureAdapter會被young gc回收,不會晉升到老年代。但在本例中,該dubbo調用被放到了corePoolSize=150,maxPoolSize=500的業務通用線程池中執行,該線程池會執行其他不需要調用dubbo服務的任務,并且該線程池的使用率并不高,這就意味著一個線程調用完dubbo服務后可能要過一段時間才能執行下一次dubbo調用。

由于這個原因導致FutureAdapter被放入ThreadLocal后,在新生代停留過長時間,最終晉升到老年代,這個"過長時間"對于此項目來說是6次young gc的間隔時長,這個時長的獲取方法會在后續說明。

(2)解決方案

對于此業務來說,這個dubbo調用可以改為查詢本地緩存,直接解決了問題。除此之外還有其他解決方案,需要結合自身業務選擇合適的方案。

  1. 直接使用dubbo的異步調用,而不是在上層再創建一個線程池來進行調用。
  2. 合理設置線程池的大小,提高線程的利用率。
  3. 寫一個Dubbo Filter,每次同步調用完后清理FutureContext(影響面可能較大,需自行評估風險)。

3.2. Jackson的BufferRecycler導致的大量char[65536]

(1)分析過程

從dominator tree中我們能看到char[]也占用了相當大的一部分內存,展開char[],發現其中包含大量的char[65536],使用oql統計得知不被gc root引用的有1600個,占用內存200M左右,被gc root引用的有500個,這種char[65536]里存儲的數據均為http接口返回值反序列化后的字符。其被gc root引用時的鏈路如下,均被ThreadLocal里的BufferRecycler引用:

在Jackson庫中,BufferRecycler的主要作用是管理緩沖區的重用,可以減少頻繁的內存分配和釋放,從而降低垃圾回收的負擔,提高性能。但從堆上看,這些char數組里不可達的數量遠大于可達的數量(1600:500),說明其復用率并不高,與其設計的目標不符,需要查看源碼才能搞清原因。

項目使用jackson的ObjectMapper。

writeValueAsString()方法對http接口返回值進行了反序列化,使用的Jackson版本為2.10,該方法完整的執行流程如下圖:

簡單來說,jackson在反序列化時,會將反序列化的結果存儲在多段char[]里,每當最后一個char[]空間不夠存放結果時,就新建一個char[],大小為最后使用的char[]的1.5倍,但不超過65536,反序列化結束后將char[]列表拼接起來就得到了結果,然后線程會將最后使用的那個char[]存放到ThreadLocal。此線程下次反序列化時,會從ThreadLocal取出這個char[]進行復用。這樣的一個復用邏輯會有一個問題,參考下圖:

圖中,_segements是當前反序列化使用過的char[]列表,currentSegement是當前正在使用的char[]。一個char[]的大小最大為65536。在第二次反序列化大對象時至少會創建一個新的大小為65536的char[](上一次的char[]是65536,再創建一個新char[]其大小仍不能超過65536)。可以看到在第一次反序列化結束后和第二次反序列化結束后,雖然ThreadLocal里存放的char[]大小都是65536,但其實它們已經不是同一個對象了。這樣的一個替換是沒有必要的,完全可以一直復用同一個char[]。

當業務所有http接口的返回值都大且流量也大時,每次保存在ThreadLocal里的char[65536]雖然會在下次反序列化結束時被替換導致其失去引用,但由于其在新生代只存活了一次接口請求的時間,所以不會晉升到老年代,可以被young gc回收。但是我們項目用來處理http請求的線程池都是同一個,這些接口的返回值只有一部分超過了65536,在小于的時候ThreadLocal里的char[]不會被替換,當這個char[]在ThreadLocal里停留一段時間后,就會晉升到老年代,從而導致老年代內存增長。

(2)解決方案

  1. 關閉Jackson的USE_THREAD_LOCAL_
    FOR_BUFFER_RECYCLING,關閉該開關會在每次反序列化時創建一個BufferRecycler,而不是復用ThreadLocal里的BufferRecycler,這樣可能導致young gc頻率提高。
  2. 升級Jackson版本,請參考此issue,2.17版本的jackson在調用releaseByteBuffer時會避免較小或者相同大小的char數組替換原有數組。

由于項目使用的jackson版本是2.10,直接升級到2.17的版本跨度較大,可能帶來不必要的風險,因此采用了方案1,上線后,young gc頻率沒有明顯增加。方案2的issue里有提到使用2.16版本引入的RecyclerPool代替基于ThreadLocal的實現,這也是解決方案之一。

3.3 對象晉升年齡閾值過小

(1)背景知識

java對象從新生代晉升到老年代有多種原因,在本項目中,對象的主要晉升原因是在新生代長期存活,這個長期具體是多久有以下兩個判斷條件:

  • 對象晉升年齡閾值
    可通過-XX:MaxTenuringThreshold啟動項進行配置,對于CMS,默認值是6。此參數定義了對象在年輕代存活的最大年齡,如果一個對象在年輕代經過N次GC后依然存活,它將會被晉升到老年代。
  • 動態年齡判定
    在survivor區中小于或等于某年齡的的所有對象大小的總和大于survivor空間的一定比例時,大于或等于該年齡的對象就直接進入老年代,這個比例可以通過-XX:TargetSurvivorRatio啟動項控制,默認值為50,代表50%。

一個對象的年齡滿足上述兩個條件之一時,就會晉升到老年代,具體的晉升年齡可以通過在啟動項里添加-XX:+PrintTenuringDistribution獲取,添加該參數后的gc日志如下圖:

其中區域2的(max 6)代表-XX:MaxTenuringThreshold啟動項配置的值,也就是說對象到達這個年齡一定會晉升,而new threshold 6代表對象實際晉升的年齡,上圖代表這次young gc因對象到達年齡閾值會導致9946864 bytes的對象晉升。

區域1代表動態年齡判定所需的空間大小,也就是(survivor空間大小 x targetSurvivotRatio)。此項目堆的單個survivor空間為200M,所以只要在survivor區中小于或等于某年齡的所有對象大小的總和大于200Mx50%,大于或等于該年齡的對象就會晉升。

而下圖的對象是因為動態年齡判定才晉升的,這次young gc因動態年齡判定會導致38660424 bytes的對象晉升:

(2)分析過程

優化前+調參前:

在進行dubbo和jackson以及其他業務代碼上的優化前,我們保存了當時的gc日志,可以看到大部分對象都是因為年齡到達6晉升的,每次young gc約有10M~16M左右的對象晉升,顯然對象的晉升年齡閾值太小,需要調大。

優化后+調參前:

在調整 JVM 參數之前,我們決定先著手進行業務上的優化。因為直接進行參數調整可能會治標不治本,無法消除潛在的隱患。在完成業務代碼上的優化后,可以看到此時由于年齡達到6這一閾值晉升的對象大小從最開始的10M~16M降為了4M以下,意味著在新生代長期存活的對象數量明顯減少了,但仍然有優化空間。

(3)解決方案

在完成業務代碼上的優化后,我們對 JVM 參數進行了調整。將-XX:MaxTenuringThreshold參數改為15,-XX:TargetSurvivorRatio改為75%(實際上,通過調參后的gc日志我們能確定對于這個項目來說,50%也已經夠用,因為年齡1到15的對象占用的總內存只有38M左右,遠遠小于單個survivor空間的50%),以延長對象在新生代的存活時間。我們可以觀察到,盡管會有一些對象存活到年齡15的閾值才晉升,但是這部分對象的總大小變小了,大部分情況下都是小于2M。這部分對象通過添加監控的方式判斷大概率是被移除(大小不足被淘汰,過期等原因)的caffeine本地緩存。

在經過上述一系列優化措施以及一些其他問題的修復后,該工程的 Full GC 頻率從最初的每天 120 次,總耗時 1 分鐘到 1.5 分鐘,成功降低到每天約 30 次左右,總耗時控制在 15 秒到 25 秒之間。

① GC次數優化曲線


② GC總耗時優化曲線


總的來說,進行GC優化時,可以使用以下工具分析當前內存/GC情況:

  1. 先用jamp生成dump文件,再使用MAT進行分析,找到可能引發問題的對象。
  2. 使用內存分配火焰圖找到哪些代碼在頻繁的分配內存。
  3. 使用GC日志分析GC情況,了解GC頻率/觸發GC的原因等信息。

使用這些工具找到問題后,可以修改對應的業務代碼或者調整JVM相關參數,以優化Full GC頻率。

責任編輯:龐桂玉 來源: vivo互聯網技術
相關推薦

2025-08-11 02:00:52

2021-04-12 09:36:14

JVM生產問題JVM FULL GC

2020-03-03 17:35:09

Full GCMinor

2021-04-14 10:14:34

JVM生產問題定位內存泄露

2017-06-09 08:49:07

加載器Full GCJVM

2022-12-17 19:49:37

GCJVM故障

2025-03-31 04:25:00

2009-07-08 15:11:58

JVM GC調整優化

2017-11-08 15:23:57

Java GC優化jvm

2021-11-17 08:16:03

內存控制Go

2017-03-29 14:44:20

網絡性能優化

2022-05-17 09:02:30

前端性能優化

2009-04-20 08:51:50

MySQL查詢優化數據庫

2019-12-13 10:25:08

Android性能優化啟動優化

2023-05-11 07:30:10

KV存儲GC優化

2025-09-03 01:23:00

2023-08-01 08:20:42

JVM優化虛擬機

2025-09-23 10:08:18

2017-03-14 18:48:06

Android性能優化內存優化

2018-04-13 10:38:49

數據庫SQLJoin
點贊
收藏

51CTO技術棧公眾號

日韩精品久久久久久久玫瑰园| 成人欧美一区二区三区黑人麻豆| 97久久久免费福利网址| 亚洲一级Av无码毛片久久精品| 超碰超碰在线| 成人av网站在线| 欧美与欧洲交xxxx免费观看| 欧美日韩高清丝袜| 四虎精品永久免费| 亚洲国产视频一区| 欧美另类网站| 国产又黄又粗又硬| 在线播放不卡| 国产一区二区三区直播精品电影| 999在线观看| 黑人玩欧美人三根一起进| 99久久国产综合精品麻豆| 国产成人精品免费视频| 男人av资源站| 思热99re视热频这里只精品| 在线观看免费视频综合| 热久久最新网址| 青青青草原在线| 激情综合色播激情啊| 91精品国产乱码久久久久久蜜臀| 亚洲AV无码成人精品区明星换面| 国产精品亚洲欧美一级在线| 天天综合色天天| 亚洲a∨一区二区三区| 亚洲精品综合网| 日本成人超碰在线观看| 欧美激情在线有限公司| 91导航在线观看| 精品国产乱子伦一区二区| 欧美日韩激情一区二区三区| 久久久久久久中文| 五月婷婷视频在线观看| 欧美国产日韩亚洲一区| 国产女人水真多18毛片18精品| 中国女人一级一次看片| 在线观看一区| 久热爱精品视频线路一| 免费网站在线高清观看| 奇米777国产一区国产二区| 欧美一区二区三区在线观看| 成人一区二区三| 暧暧视频在线免费观看| 亚洲同性gay激情无套| 日韩欧美在线一区二区| 青青草免费在线视频| 成人午夜av电影| 亚洲一区二区三区香蕉| 亚洲av人无码激艳猛片服务器| av成人天堂| 欧美激情奇米色| 黑人操日本美女| 国产探花一区二区| 亚洲欧洲在线观看| 少妇按摩一区二区三区| 久久久久高潮毛片免费全部播放| 欧美一区二区三区免费观看视频 | 久草在线青青草| av在线一区二区| 国产 高清 精品 在线 a| 99在线精品视频免费观看软件| 蜜臀精品一区二区三区在线观看| 欧洲午夜精品久久久| 久久免费激情视频| 亚洲专区免费| 欧洲精品毛片网站| 天天操天天干天天摸| 三级久久三级久久久| 国产成人精品久久二区二区91| 91精品国产高清一区二区三密臀| 99精品国产在热久久| 性色av香蕉一区二区| 国产精品免费av一区二区| 亚洲激情av| 97在线视频一区| 日本一区二区三区精品| 久久久噜噜噜久久狠狠50岁| 国产精品99免视看9| 正在播放木下凛凛xv99| 韩国成人福利片在线播放| 亚洲直播在线一区| 国产综合无码一区二区色蜜蜜| 成人精品视频网站| 久久福利电影| 国产永久免费高清在线观看 | 免费在线观看成年人视频| 希岛爱理av免费一区二区| 亚洲三级av在线| 又色又爽的视频| 一本精品一区二区三区| 欧美黄色成人网| 日本特级黄色片| 蜜桃av噜噜一区| 2019国产精品视频| 神马一区二区三区| 欧美国产在线观看| www.亚洲成人网| 超碰一区二区| 欧美日韩国产精品成人| 国产麻豆剧传媒精品国产| 欧美a一欧美| 色七七影院综合| 久久久久久久久久综合| 香蕉成人久久| 成人黄色在线观看| 天堂中文在线观看视频| 日本一区二区高清| 日本一区午夜艳熟免费| 日韩不卡免费高清视频| 欧美一级片免费看| aaaaa级少妇高潮大片免费看| 日韩精品午夜| 性亚洲最疯狂xxxx高清| 影音先锋黄色网址| 波多野结衣中文一区| 天天人人精品| 国产无遮挡裸体视频在线观看| 欧洲色大大久久| 久久人妻少妇嫩草av蜜桃| 国产精品一区二区av交换| 久久99久国产精品黄毛片入口| 国产无遮挡呻吟娇喘视频| 国产在线看一区| 日本成人看片网址| www.综合网.com| 欧美蜜桃一区二区三区| 性欧美成人播放77777| 亚洲综合专区| 国产精品电影观看| 天堂av在线资源| 一区二区三区免费观看| 一区二区三区 日韩| 欧美黑人做爰爽爽爽| 久久91亚洲人成电影网站| 久久久久久av无码免费看大片| av在线这里只有精品| 黄色网在线视频| 日本在线一区二区| 亚洲欧美另类在线观看| 日本天堂网在线观看| 国产一区二区三区久久久| 清纯唯美一区二区三区| 少妇淫片在线影院| 亚洲成人网av| 久久久久成人精品无码| 激情图区综合网| 亚洲精品中字| av成人免费看| 国产亚洲精品久久久| 天天干天天干天天干天天| 成人一区二区视频| 轻点好疼好大好爽视频| 日本一区二区三区电影免费观看| 日韩一区二区在线视频| 在线观看亚洲国产| 国产精品毛片a∨一区二区三区| 日韩精品一区二区三区色欲av| 欧美日韩一区二区三区在线电影 | 里番在线观看网站| 欧美天天综合网| 国内精品卡一卡二卡三| 日韩1区2区日韩1区2区| 香蕉久久夜色| av成人免费| 日韩中文字幕久久| 国产精品女人久久久| 亚洲天堂av一区| 波多野结衣在线免费观看| 欧美 日韩 国产一区二区在线视频 | 国产高潮免费视频| 婷婷久久综合| 成人在线观看91| 福利在线免费视频| 亚洲免费av片| 在线黄色av网站| 亚洲精品日日夜夜| 中文视频在线观看| 三级影片在线观看欧美日韩一区二区| 日韩av一区二区三区在线| 青娱乐极品盛宴一区二区| 欧美精品午夜视频| 五十路在线视频| 欧美最猛性xxxxx直播| 自拍偷拍第9页| 成人禁用看黄a在线| 日本精品一区二区三区四区| 成人影院在线| 国产98在线|日韩| 成人av免费电影网站| 色老头一区二区三区在线观看| 国产成人a人亚洲精品无码| 欧美日韩在线视频一区二区| 国产在视频线精品视频| 福利一区福利二区| 国产熟人av一二三区| 欧美日韩91| 少妇精品久久久久久久久久| 亚洲成av人片在线观看www| 日韩暖暖在线视频| 日本三级在线视频| 欧美xxxxxxxx| 精品国产免费观看| 亚洲嫩草精品久久| xxxx黄色片| 日本不卡高清视频| 国产尤物av一区二区三区| 自拍偷拍一区| 国产欧美日韩亚洲精品| 黑人玩欧美人三根一起进| 精品亚洲精品福利线在观看| 国产强伦人妻毛片| 欧美日韩精品二区| 亚洲欧洲综合网| 成人午夜激情视频| 99精品999| 999亚洲国产精| 一级做a爰片久久| 精品久久ai| 亚洲一区二区免费| 欧美7777| 欧美人与性动交a欧美精品| 亚洲第一色视频| 欧美日韩大陆一区二区| 日韩精品成人在线| 中文字幕一区二区视频| 极品人妻一区二区| 久久精品国内一区二区三区| 我的公把我弄高潮了视频| 四虎成人精品永久免费av九九| 国产一区欧美二区三区| 韩日成人影院| 欧美激情综合色综合啪啪五月| 黄色在线观看网| 欧美精品一区二区久久婷婷| 国产精品久久免费| 色综合久久88色综合天天| 久操视频免费在线观看| 国产午夜精品一区二区三区嫩草| 午夜视频在线观看国产| 国模娜娜一区二区三区| 日本成人中文字幕在线| 国产精品扒开腿做爽爽爽软件| 亚洲精品在线视频观看| 国产成人精品999在线观看| 国产精品日韩一区二区| 亚洲综合网站| 91夜夜未满十八勿入爽爽影院| 美女福利一区二区| 欧美激情影音先锋| 17videosex性欧美| 欧美精品xxx| 性爱视频在线播放| 九九久久国产精品| 黄色在线视频网站| 国产亚洲精品久久| 福利小视频在线观看| 精品福利视频一区二区三区| 国产夫妻在线观看| 日韩一级黄色片| 一区二区www| 69av一区二区三区| 在线观看视频中文字幕| 欧美日韩五月天| 91精品国产乱码久久| 欧美人动与zoxxxx乱| 中日精品一色哟哟| 欧美揉bbbbb揉bbbbb| 一级淫片免费看| 678五月天丁香亚洲综合网| 国产巨乳在线观看| 精品日韩在线观看| 天堂在线中文网| 日韩经典第一页| 四虎国产精品永远| 自拍偷拍亚洲一区| 免费黄色在线| 超碰精品一区二区三区乱码| 超碰porn在线| 欧美极品少妇xxxxx| 123区在线| 欧美一区二区三区图| 国语自产精品视频在线看抢先版结局| 国产精品偷伦一区二区| 男人亚洲天堂| 国产精品夜色7777狼人| 日韩成人精品| 国产偷久久久精品专区| 首页亚洲中字| 四虎免费在线观看视频| 欧美久久一级| 男人日女人下面视频| 亚洲影院免费| 捷克做爰xxxⅹ性视频| 国产激情偷乱视频一区二区三区| 蜜臀aⅴ国产精品久久久国产老师| 久久久久久**毛片大全| 中文乱码字幕高清一区二区| 亚洲精品水蜜桃| 国产午夜视频在线| 欧洲一区在线观看| 99热这里只有精品9| 亚洲国产欧美一区二区三区同亚洲 | 久久理论电影| 久艹在线免费观看| 日韩国产精品久久久久久亚洲| 日本少妇xxx| 91丨porny丨最新| 粉嫩精品久久99综合一区| 亚洲国产欧美在线| 中国黄色一级视频| 精品国产髙清在线看国产毛片| 亚洲男人第一天堂| 中国人与牲禽动交精品| 免费毛片在线看片免费丝瓜视频| 高清一区二区三区四区五区| 日本精品久久| 鲁鲁狠狠狠7777一区二区| 91精品成人| 亚洲人成无码网站久久99热国产 | 亚洲一区二区av| 精品卡一卡二| 欧美国产三区| 欧美午夜性生活| 福利电影一区二区三区| 亚洲精品一区二区三区在线播放| 精品久久久国产| 精品国产黄色片| 日韩亚洲综合在线| av高清不卡| 91久久国产婷婷一区二区| 国产 日韩 欧美 综合 一区| 青青草免费在线视频观看| 日韩精品每日更新| 精品人妻一区二区三区日产| 亚洲精品精品亚洲| 在线亚洲欧美日韩| 亚洲精品一区在线观看香蕉| www在线观看黄色| 亚洲一区二区中文| 成人久久电影| 欧美一级黄色影院| 久久免费午夜影院| 日韩欧美一区二区一幕| 亚洲福利视频专区| 在线中文免费视频| 91精品国产综合久久香蕉的用户体验| 欧美中文一区二区| 一本久道中文无码字幕av| 97精品电影院| 九九热精品免费视频| 日韩欧美在线综合网| 国产网站在线免费观看| 国产情人节一区| 亚洲精品成人| 国产精品久久久久久9999| 国产精品免费人成网站| 国产精品自拍第一页| 中文字幕精品—区二区| 国产一区一一区高清不卡| 麻豆亚洲一区| 日韩精品国产欧美| 色欲AV无码精品一区二区久久| 色噜噜狠狠色综合欧洲selulu| 高清国产福利在线观看| 国产精品极品美女在线观看免费| 男男gay无套免费视频欧美| 精品久久久噜噜噜噜久久图片| 国产午夜精品一区二区| 国产天堂第一区| 久久精品视频99| 精品一区二区三区四区五区| 日本a级片在线观看| 成人毛片老司机大片| 自拍偷拍欧美亚洲| 精品视频在线播放色网色视频| 性欧美videohd高精| 欧美日韩精品久久久免费观看| 日韩专区欧美专区| 欧美日韩午夜视频| 日韩欧美国产综合一区 | 欧美激情在线播放| 嫩草国产精品入口| 777久久久精品一区二区三区| 久久久国际精品| 一区二区精品视频在线观看| 久久精彩免费视频| 欧美成人一区在线观看| 日日摸天天爽天天爽视频| 国产精品视频你懂的| 亚洲精品字幕在线| 日本中文字幕成人| 91亚洲自偷观看高清| 亚洲av人人澡人人爽人人夜夜| 狠狠色狠色综合曰曰| 飘雪影视在线观看免费观看| 91精品视频在线免费观看|