国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

線上服務(wù)頻繁Full GC?鋸齒狀內(nèi)存波動(dòng)的深度排查與根治指南

開(kāi)發(fā) 前端
線上服務(wù)頻繁Full GC和鋸齒狀內(nèi)存波動(dòng),是一個(gè)典型的“對(duì)象創(chuàng)建與回收節(jié)奏失衡”問(wèn)題。它更像一個(gè)性能“癥狀”,而非“疾病”本身。

作為一名長(zhǎng)期與JVM打交道的開(kāi)發(fā)者,最令人神經(jīng)緊繃的監(jiān)控告警之一莫過(guò)于:“您的服務(wù)正在頻繁進(jìn)行Full GC”。這不僅僅是一條告警,更是性能瓶頸、響應(yīng)延遲甚至服務(wù)宕機(jī)的前兆。當(dāng)監(jiān)控圖表上清晰地顯示出堆內(nèi)存如鋸齒般規(guī)律地起伏(例如從2G->1.8G->2G),這背后一定隱藏著某個(gè)“劇本”。今天,我們就來(lái)當(dāng)一回JVM世界的“偵探”,徹底揭開(kāi)這個(gè)鋸齒狀波動(dòng)的秘密,并找到根治之法。

一、現(xiàn)象解讀:鋸齒背后的信號(hào)

首先,我們要讀懂監(jiān)控告訴我們的信息。

? 鋸齒狀波動(dòng) (2G -> 1.8G -> 2G):這是一個(gè)非常典型且重要的模式。它告訴我們:

(1)內(nèi)存被穩(wěn)定地分配和釋放:堆內(nèi)存使用量緩慢而穩(wěn)定地上升到接近最大容量(例如2G),然后被一次垃圾回收(很可能是Full GC)瞬間打回一個(gè)較低的值(例如1.8G),之后這個(gè)循環(huán)再次開(kāi)始。

(2)可能不是內(nèi)存泄漏:如果是內(nèi)存泄漏,曲線應(yīng)該是“階梯式”上漲,每次GC后回收的內(nèi)存越來(lái)越少,最終耗盡。而鋸齒狀更傾向于表明有大量對(duì)象在短時(shí)間內(nèi)同時(shí)變成垃圾,GC能回收掉絕大部分,但過(guò)程很吃力。

? 頻繁Full GC:Full GC是JVM的“全局停頓”事件,會(huì)停止所有應(yīng)用線程(Stop-The-World),對(duì)整個(gè)堆(Young Gen, Old Gen)以及方法區(qū)(元空間)進(jìn)行回收。它的頻繁發(fā)生直接導(dǎo)致:

? 應(yīng)用平均響應(yīng)時(shí)間(RT)飆升。

? 吞吐量(TPS/QPS)下降。

? 用戶體驗(yàn)極差,感覺(jué)服務(wù)“一卡一卡”的。

將兩者結(jié)合,我們的核心排查思路就是:究竟是什么樣的大量對(duì)象,在以什么樣的方式創(chuàng)建,最終觸發(fā)了Full GC?

二、破案工具集:拿出你的“顯微鏡”和“聽(tīng)診器”

在深入分析原因前,必須準(zhǔn)備好排查工具。盲目猜測(cè)是調(diào)優(yōu)的大忌。

1. jstat -gcutil:命令行首選,實(shí)時(shí)監(jiān)控GC狀態(tài)。

jstat -gcutil <pid> 1000  # 每1秒輸出一次當(dāng)前進(jìn)程的GC統(tǒng)計(jì)數(shù)據(jù)

重點(diǎn)關(guān)注 FGC/FGCT(Full GC次數(shù)/總耗時(shí))、OU(老年代使用容量)。

2. GC日志:這是最重要的證據(jù)! 必須在JVM啟動(dòng)參數(shù)中開(kāi)啟。

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/path/to/gc.log

對(duì)于Java 8及以上,推薦使用更強(qiáng)大的日志框架:

-Xlog:gc*=info:file=/path/to/gc.log:time,tags:filecount=5,filesize=10M

GC日志會(huì)詳細(xì)記錄每次GC的類(lèi)型、時(shí)間、內(nèi)存回收前后大小、耗時(shí)等。

3. 堆轉(zhuǎn)儲(chǔ)(Heap Dump):當(dāng)懷疑某些對(duì)象過(guò)多時(shí),可以生成堆內(nèi)存的快照進(jìn)行分析。

jmap -dump:live,format=b,file=heap_dump.hprof <pid>  # 觸發(fā)一次Full GC后轉(zhuǎn)儲(chǔ),影響較大
# 或者使用工具動(dòng)態(tài)分析(如Arthas的`heapdump`命令)

使用MAT(Eclipse Memory Analyzer Tool)或JProfiler等工具分析dump文件。

4. APM工具(Arthas, SkyWalking, Pinpoint):這些應(yīng)用性能管理工具可以幫我們快速定位到慢查詢(xún)、熱點(diǎn)方法,甚至關(guān)聯(lián)出具體的代碼行。

強(qiáng)烈建議: 立即在測(cè)試或預(yù)發(fā)環(huán)境復(fù)現(xiàn)問(wèn)題,并加上上述監(jiān)控和日志參數(shù)。線上環(huán)境如果條件允許,也應(yīng)在業(yè)務(wù)低峰期盡快添加。

三、深度排查:揪出“元兇”的四種常見(jiàn)場(chǎng)景

鋸齒狀波動(dòng)和頻繁Full GC,根源通常不在老年代本身,而在于對(duì)象如何從年輕代晉升到老年代。以下是四大常見(jiàn)“元兇”及其排查手法。

場(chǎng)景一:短命的大對(duì)象——直接進(jìn)入老年代的“巨無(wú)霸”

JVM有一個(gè)參數(shù):-XX:PretenureSizeThreshold。它的作用是,如果創(chuàng)建一個(gè)對(duì)象的大小超過(guò)這個(gè)閾值,為了避免在年輕代的Survivor區(qū)之間來(lái)回復(fù)制,這個(gè)對(duì)象會(huì)直接分配在老年代。

? 推理過(guò)程:
如果你的代碼中頻繁創(chuàng)建了略大于這個(gè)閾值(默認(rèn)可能是0,意味著默認(rèn)不啟用,但有些框架或容器可能會(huì)設(shè)置)的大對(duì)象(比如大數(shù)組、大的字符串緩存等),它們會(huì)跳過(guò)年輕代,直接占據(jù)老年代的空間。老年代的空間通常是被緩慢填充的,當(dāng)這些“巨無(wú)霸”對(duì)象突然變成垃圾時(shí),就會(huì)觸發(fā)一次Full GC來(lái)回收它們,從而形成鋸齒圖。

? 如何驗(yàn)證:

(1)檢查JVM參數(shù),看是否設(shè)置了 PretenureSizeThreshold

(2)在GC日志中搜索 PSYoungGen(Parallel Scavenge收集器的年輕代GC),觀察每次Young GC后老年代使用量(ParOldGen)的漲幅。如果Young GC很平靜,但老年代使用量卻莫名其妙地快速增長(zhǎng),很可能就是大對(duì)象直接分配。

(3)使用jmap -histo <pid> 或分析堆轉(zhuǎn)儲(chǔ),查看數(shù)量眾多的、體積龐大的對(duì)象是哪些。

? 代碼示例:

// 假設(shè) PretenureSizeThreshold 被設(shè)置為3MB
public class BigObjectCreator {
    public void processRequest() {
        // 每次請(qǐng)求都創(chuàng)建一個(gè)2MB的數(shù)組,這會(huì)在年輕代正常分配和回收
        byte[] smallObj = new byte[2 * 1024 * 1024];

        // 但如果是創(chuàng)建一個(gè)4MB的數(shù)組,就會(huì)直接進(jìn)入老年代!
        byte[] bigObj = new byte[4 * 1024 * 1024]; // 元兇!
        // ... 使用bigObj
        // 方法結(jié)束,bigObj在老年代成為垃圾,等待Full GC回收
    }
}
場(chǎng)景二:過(guò)早晉升(Premature Promotion)——Survivor區(qū)的“叛徒”

這是最常見(jiàn)的原因。對(duì)象本該在年輕代被回收,卻意外地進(jìn)入了老年代,撐爆了老年代。
年輕代的GC(Minor GC)規(guī)則是:對(duì)象在Eden區(qū)出生,經(jīng)過(guò)一次Minor GC后如果還存活,會(huì)進(jìn)入Survivor區(qū)(S0或S1)。每經(jīng)歷一次Minor GC且存活,年齡就+1。當(dāng)年齡達(dá)到一定閾值(-XX:MaxTenuringThreshold,默認(rèn)15),才會(huì)晉升到老年代。

? 推理過(guò)程:
如果Survivor區(qū)的空間太小,或者短時(shí)間內(nèi)產(chǎn)生的大量存活對(duì)象在一次Minor GC后,Survivor區(qū)完全放不下,那么多出的存活對(duì)象就會(huì)被迫提前晉升到老年代,無(wú)論它們的年齡是多少。這些本應(yīng)短壽的對(duì)象占據(jù)了老年代,很快又集體變成垃圾,從而頻繁觸發(fā)Full GC。

? 如何驗(yàn)證:

(1)查看GC日志:這是關(guān)鍵。關(guān)注每次Minor GC的日志:

[PSYoungGen: 524800K->8156K(611840K)]  -> 年輕代回收了大部分空間
654321K->143765K(2023424K)] -> 但堆內(nèi)存總量只下降了一點(diǎn)點(diǎn)
0.0212345 secs]

關(guān)鍵點(diǎn):年輕代回收效果很好(從524800K到8156K),但整個(gè)堆的內(nèi)存回收效果很差(從654321K到143765K)。這中間巨大的差值,就是被迫晉升到老年代的對(duì)象大小。

(2)使用jstat:觀察 S0CS1C(Survivor區(qū)容量)和 S0US1U(使用量)。如果它們的使用率長(zhǎng)期100%或者頻繁為0,說(shuō)明Survivor區(qū)分配/交換激烈,可能太小。

? 解決方案思路:

(1)增大年輕代,特別是Survivor區(qū):-Xmn 參數(shù)設(shè)置整個(gè)年輕代大小。Survivor區(qū)占比由 -XX:SurvivorRatio=8(表示Eden:S0:S1=8:1:1)控制。如果Survivor區(qū)太小,可以適當(dāng)減小這個(gè)比值,比如設(shè)置為 -XX:SurvivorRatio=6(Eden:S0:S1=6:1:1)。

(2)優(yōu)化程序:減少不必要的對(duì)象創(chuàng)建,尤其是循環(huán)中和高頻方法中的對(duì)象創(chuàng)建。例如,避免在日志打印中拼接大字符串(使用占位符log.debug("User id is {}", userId)而不是"User id is " + userId)。

場(chǎng)景三:緩存失控——“永不消失”的臨時(shí)工

很多框架(如Spring, MyBatis, Hibernate)或自實(shí)現(xiàn)代碼中,會(huì)使用緩存來(lái)提升性能。但如果緩存沒(méi)有合適的淘汰策略(如LRU、LFU),或者緩存的生命周期與請(qǐng)求綁定而不是與會(huì)話綁定,就可能導(dǎo)致大量本該回收的對(duì)象被緩存引用而無(wú)法釋放。

? 推理過(guò)程:
緩存對(duì)象通常具有中等生命周期,容易被放入老年代。如果緩存不斷增長(zhǎng)且沒(méi)有有效的淘汰機(jī)制,老年代最終會(huì)被填滿,觸發(fā)Full GC。但Full GC也無(wú)法回收這些被強(qiáng)引用緩存的對(duì)象,導(dǎo)致GC效果差,很快又會(huì)再次觸發(fā)Full GC,形成惡性循環(huán)。鋸齒圖可能不那么“完美”,但頻繁Full GC是肯定的。

? 如何驗(yàn)證:

(1)生成堆轉(zhuǎn)儲(chǔ),使用MAT分析:這是最直接的方法。在MAT中查看 Dominator Tree 或 Histogram,找到占用內(nèi)存最大的對(duì)象。查看其GC Root路徑,很容易就能發(fā)現(xiàn)是不是被某個(gè) HashMap 或 ConcurrentHashMap 所引用。

(2)檢查代碼中所有使用 Map 作為緩存的地方。

? 解決方案:

// 不良緩存示例
public class BadCache {
    private static final Map<String, Object> CACHE = new ConcurrentHashMap<>(); // 強(qiáng)引用,GC無(wú)法回收

    public void addToCache(String key, Object value) {
        CACHE.put(key, value);
    }
}

// 改進(jìn):使用Caffeine with max size and expire time
public class GoodCache {
    private static final Cache<String, Object> CACHE = Caffeine.newBuilder()
            .maximumSize(10000)
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .build();

    public void addToCache(String key, Object value) {
        CACHE.put(key, value);
    }
}

(1)使用弱引用(WeakHashMap)或軟引用(SoftReference)來(lái)實(shí)現(xiàn)緩存,讓GC在內(nèi)存緊張時(shí)可以回收這些對(duì)象。

(2)使用專(zhuān)業(yè)的緩存庫(kù)(如Caffeine, Guava Cache),并設(shè)置合理的最大容量和過(guò)期時(shí)間。

場(chǎng)景四:API響應(yīng)數(shù)據(jù)過(guò)大或循環(huán)調(diào)用

這種情況在外接接口或RPC調(diào)用中常見(jiàn)。

? 推理過(guò)程:
某個(gè)API接口或遠(yuǎn)程方法調(diào)用,返回了一個(gè)非常大的JSON/XML響應(yīng)或數(shù)據(jù)對(duì)象。在解析這個(gè)響應(yīng)時(shí)(例如使用Jackson/Gson反序列化),會(huì)創(chuàng)建大量的臨時(shí)對(duì)象。如果這個(gè)調(diào)用發(fā)生在一個(gè)循環(huán)或高頻請(qǐng)求中,就會(huì)在極短時(shí)間內(nèi)產(chǎn)生海量對(duì)象,迅速撐爆年輕代,并導(dǎo)致大量對(duì)象提前晉升到老年代。

? 如何驗(yàn)證:

(1)結(jié)合APM工具(如Arthas)的 trace 或 monitor 命令,定位到耗時(shí)較長(zhǎng)、調(diào)用次數(shù)多的方法。

(2)在GC日志中,可以看到兩次GC的間隔時(shí)間非常短,并且每次回收后老年代使用率都有顯著上升。

(3)檢查代碼中的外部調(diào)用和循環(huán)邏輯。

四、解決方案與調(diào)優(yōu)實(shí)踐

排查到根本原因后,解決方案就水到渠成了。

1. 首要任務(wù):優(yōu)化代碼

? 減少不必要的對(duì)象創(chuàng)建:審視代碼中的循環(huán)、高頻方法、日志打印。

? 避免大對(duì)象:拆分大數(shù)組、大集合。

? 設(shè)計(jì)合理的緩存:使用帶容量和過(guò)期時(shí)間的緩存框架。

2. 合理設(shè)置JVM參數(shù)(基于監(jiān)控?cái)?shù)據(jù))

? 不要盲目調(diào)大堆內(nèi)存:-Xmx4g 可能會(huì)讓鋸齒的周期變長(zhǎng),但停頓時(shí)間可能更長(zhǎng),只是“掩耳盜鈴”。

? 調(diào)整新生代與老年代的比例:如果確實(shí)存在大量朝生夕死的對(duì)象,可以適當(dāng)增大新生代比例 -XX:NewRatio=2(表示老年代:年輕代=2:1,即年輕代占整個(gè)堆的1/3)。

? 調(diào)整Survivor區(qū)比例:如果發(fā)現(xiàn)過(guò)早晉升,嘗試調(diào)小 -XX:SurvivorRatio

? 選擇更適合的GC器:對(duì)于響應(yīng)時(shí)間敏感的應(yīng)用,可以嘗試使用低停頓的G1GC或ZGC。

# 使用G1GC的示例參數(shù)
-XX:+UseG1GC
-Xmx4g
-Xms4g
-XX:MaxGCPauseMillis=200  # 設(shè)置目標(biāo)停頓時(shí)間

調(diào)優(yōu)是一個(gè)迭代和驗(yàn)證的過(guò)程。 每次只調(diào)整一個(gè)參數(shù),然后持續(xù)觀察監(jiān)控和GC日志,看性能指標(biāo)(RT, TPS, FGC頻率)是否向好的方向發(fā)展。

五、總結(jié)

線上服務(wù)頻繁Full GC和鋸齒狀內(nèi)存波動(dòng),是一個(gè)典型的“對(duì)象創(chuàng)建與回收節(jié)奏失衡”問(wèn)題。它更像一個(gè)性能“癥狀”,而非“疾病”本身。我們的排查思路就像一個(gè)偵探故事:

1. 勘察現(xiàn)場(chǎng):看懂監(jiān)控圖表和GC日志。

2. 尋找線索:利用jstat、堆轉(zhuǎn)儲(chǔ)、APM工具收集證據(jù)。

3. 推理審訊:圍繞“對(duì)象如何晉升到老年代”這一核心,對(duì)“短命大對(duì)象”、“過(guò)早晉升”、“緩存失控”、“API數(shù)據(jù)過(guò)大”四大常見(jiàn)嫌犯逐一審問(wèn)排查。

4. 定罪懲處:要么修改代碼從根源上減少對(duì)象創(chuàng)建,要么調(diào)整JVM參數(shù)為對(duì)象提供更順暢的“生命周期通道”。

記住,沒(méi)有一勞永逸的萬(wàn)能參數(shù),只有對(duì)自身應(yīng)用特性和代碼行為的深刻理解,才是解決JVM性能問(wèn)題的最強(qiáng)武器。希望這篇指南能幫你下次在遇到Full GC告警時(shí),能夠從容不迫,精準(zhǔn)地定位并解決問(wèn)題。

責(zé)任編輯:武曉燕 來(lái)源: 程序員秋天
相關(guān)推薦

2025-08-11 02:00:52

2024-08-14 14:20:00

2023-01-04 18:32:31

線上服務(wù)代碼

2018-08-10 15:00:42

服務(wù)器內(nèi)存排查

2023-04-30 12:44:28

GC應(yīng)用性能

2025-03-31 04:25:00

2022-12-17 19:49:37

GCJVM故障

2025-06-16 07:40:00

2017-08-18 22:40:33

線上線程備份

2025-04-24 09:01:37

2025-01-23 08:38:46

2024-03-11 08:51:08

JVMSWAP內(nèi)存

2021-04-14 10:14:34

JVM生產(chǎn)問(wèn)題定位內(nèi)存泄露

2021-04-12 09:36:14

JVM生產(chǎn)問(wèn)題JVM FULL GC

2018-08-17 08:44:37

服務(wù)器內(nèi)存排查

2020-03-03 17:35:09

Full GCMinor

2019-06-24 08:17:55

CPUFullGCJava

2021-08-02 15:06:46

vim服務(wù)Java

2010-10-12 10:04:30

無(wú)法無(wú)線上網(wǎng)

2019-03-29 10:22:08

Linux系統(tǒng)故障技巧
點(diǎn)贊
收藏

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

欧美在线一卡| 在线看福利影| 国产白丝精品91爽爽久久| 国产精品在线看| 日韩欧美少妇| 亚洲免费一在线| 欧美人与动牲性行为| 欧美在线观看18| 日本黄在线观看| 欧美日韩久久久久| 调教在线观看| 精品美女久久久久久免费| 欧美性猛交p30| 亚洲丰满少妇videoshd| 96久久久久久| 色狠狠久久av五月综合| 色婷婷av金发美女在线播放| 在线电影一区二区| 亚洲福利视频三区| 欧美日韩精品欧美日韩精品一综合 | 69堂精品视频在线播放| 日韩精品在线看片z| 男女啪啪在线观看| 欧美少妇bbb| 在线中文资源天堂| 91精品国产综合久久久蜜臀图片| 激情小视频在线| 在线观看视频一区二区| 91caoporn在线| 欧美一区二区精品在线| 高h视频在线观看| 亚洲精品按摩视频| 大陆av在线播放| 日本韩国一区二区| 亚洲美女在线免费观看| 亚洲综合丝袜美腿| 在线看你懂得| 欧美日韩视频在线观看一区二区三区 | 亚洲美女福利视频网站| 国产精品一区二区你懂的| 国产视频在线观看一区二区| 国产精品久久99久久| 日韩免费高清在线| 国产精品久久毛片| 原千岁中文字幕| 黑人巨大精品欧美一区免费视频| h视频网站在线观看| 亚洲精品成人av| 国产麻豆一区二区三区| 国产精品国模在线| 国产模特精品视频久久久久| 影音先锋成人资源网站| 日本一区二区不卡视频| 青青草免费观看免费视频在线| 精品美女一区二区| 91午夜精品| 国产99午夜精品一区二区三区| 久久国产乱子精品免费女| 色婷婷综合久久久久中文字幕 | www.久久.com| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲人成免费网站| 在线播放 亚洲| 亚洲欧美偷拍三级| 午夜dj在线观看高清视频完整版| 大量国产精品视频| 欧美破处大片在线视频| 少妇av一区二区三区无码| 精品露脸国产偷人在视频| 乱人伦视频在线| 国产精品爱久久久久久久| 日韩激情视频在线观看| 99热热99| 日韩激情视频在线| 93在线视频精品免费观看| 91免费国产精品| 欧美在线观看一二区| 日韩精品一区二区三区中文| 国产欧美日韩一区| 一区二区中文字幕在线| 伊人久久精品一区二区三区| 国产精品一二区| 久久色成人在线| 超碰在线网站| 91精品国产综合久久久久久蜜臀| av不卡在线观看| 欧洲一区二区三区| 91精品视频大全| 国产精品三级电影| 日韩网站中文字幕| 欧美高清一区二区| 五月激情综合网| 日韩精品中文字幕吗一区二区| 日本成人三级| 色综合天天综合网国产成人综合天 | www 日韩| 97色在线播放视频| 久久电影网电视剧免费观看| 天堂资源在线观看| 欧美成年人视频网站欧美| 麻豆精品久久久| 北岛玲日韩精品一区二区三区| 欧美亚洲在线播放| 成人av在线观| 欧美极品videos大乳护士| 国产日韩欧美一区二区| 亚洲影视在线观看| 成人爽a毛片| 黄页网站在线观看视频| 精品福利一二区| 亚洲美女少妇无套啪啪呻吟| 国产精品精华液网站| 久久人人爽人人爽人人片av高请 | 91免费在线观看网站| 自拍偷拍国产亚洲| 青青在线精品| 国产女人18毛片| 亚洲成人久久久久| 鲁大师影院一区二区三区| 国际av在线| 国产日韩专区在线| 一区二区三区在线视频观看| 给我免费播放日韩视频| 久久国产乱子伦免费精品| 中文字幕日韩欧美在线| 国产精品88av| 韩日精品一区| 菠萝蜜视频在线观看入口| 亚洲精品ady| 久99久精品视频免费观看| 欧美videosex性欧美黑吊| 日本黑人久久| 精品少妇一区二区三区视频免付费 | 午夜精品久久久久久不卡8050| 日本天堂一区| 国产三级国产精品国产专区50| 久久香蕉国产线看观看av| 99久久国产综合色|国产精品| 国产亚洲精品精品国产亚洲综合| 国产精品裸体瑜伽视频| 久久久国产一区| 欧美激情中文字幕一区二区| 9l视频自拍九色9l视频成人| 中文久久久久久| 人人爽久久涩噜噜噜网站| 亚洲国产成人av好男人在线观看| 手机在线一区二区三区| 日韩av成人| 免费av一区二区三区| 亚洲激情自拍图| 99精品在线免费| 女仆av观看一区| 中文字幕在线免费专区| 国产麻豆日韩| 亚洲精品www久久久| 99久久精品费精品国产一区二区| 看亚洲a级一级毛片| 色视频网站在线| 亚洲一区久久久| 日韩免费视频线观看| 不卡视频一二三四| 色综合中文网| 黄色网页在线看| 分分操这里只有精品| 91大神在线播放精品| 在线一区二区视频| 久久av资源站| 999久久精品| 麻豆影视在线| 亚洲在线欧美| 久久久久久综合网天天| 欧美午夜丰满在线18影院| 日韩激情在线观看| 伊色综合久久之综合久久| 中文在线网在线中文| 日本一区二区在线视频| 久久精品电影网| 黑人巨大精品欧美一区免费视频| 亚洲在线国产日韩欧美| 91在线成人| 中国动漫在线观看完整版免费| 欧美区高清在线| 最近的2019中文字幕免费一页| 亚洲综合激情小说| 久久激情综合| 美女视频亚洲色图| 看女生喷水的网站在线观看| 黄色一级片播放| 国产欧美精品一区二区三区| 色婷婷**av毛片一区| 欧美日韩亚洲高清| 国产精品中文欧美| 色婷婷热久久| 久久久成人av毛片免费观看| 亚洲人成77777男人| 你真棒插曲来救救我在线观看| 福利视频一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 日韩欧美国产系列| 亚洲成a人片在线不卡一二三区|