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

JVM 內存溢出排查指南

開發
本文通過幾個比較經典的示例演示了JVM進行垃圾回收的過程以及如何進行JVM內存調優,希望對你有幫助。

本文針對常見的幾種GC情況結合日志進行分析介紹,希望對你有幫助。

一、JVM常見命令介紹

篇幅原因關于JVM常見指令的使用與介紹,需要了解的讀者可以移步參考筆者寫的這篇文章:《JVM 指令集概覽:基礎與應用

二、詳解JVM的GC

1. 定位GC情況的兩種方式

獲取GC日志方式大抵有兩種,第一種就是設定JVM參數在程序啟動時查看,具體的命令參數為:

-XX:+PrintGCDetails # 打印GC日志
-XX:+PrintGCTimeStamps # 打印每一次觸發GC時發生的時間

第二種則是在服務器上監控:使用jstat查看,如下所示,命令格式為jstat -gc pid 輸出間隔時長 輸出次數,例如筆者希望每隔1秒輸出1次,并且打印5次,對應的指令如下:

jstat -gc 21608 1000 5

2. 拆解與分析JVM的GC日志

為了演示如何查看GC日志,筆者給出下面這樣一段代碼并結合JVM參數配置(后文會給到)展示JVM如何進行垃圾回收:

public static void main(String[] args) {
        //分配1M內存空間
        byte[] bytes = newbyte[1024 * 1024];
        //觸發minor gc,剩余512k,然后將1M空間存放至新生代,堆空間大約剩下1.5M
        bytes = newbyte[1024 * 1024];
        //分配至新生代約2.5M
        bytes = newbyte[1024 * 1024];

        //新生代空間不足,觸發full gc,新生代空間全回收,并執行CMS GC,完成后將對象存放至新生代
        byte[] byte2 = newbyte[2 * 1024 * 1024];
    }

對應我們也給出如下JVM配置參數指明新生代、老年代堆空間大小為5M,并指明新生代Eden和survivor區的比例為8:1:1,同時我們也指定的新生代和老年代垃圾回收算法分別是ParNewGC和CMS:

-XX:NewSize=5M -XX:MaxNewSize=5M -XX:InitialHeapSize=10M -XX:MaxHeapSize=10M -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

詳細解釋的含義如下,讀者可自行參閱:

-XX:NewSize=5M:設置新生代的初始大小為 5MB。
-XX:MaxNewSize=5M:設置新生代的最大大小為 5MB。
-XX:InitialHeapSize=10M:設置 JVM 堆的初始大小為 10MB。
-XX:MaxHeapSize=10M:設置 JVM 堆的最大大小為 10MB。
-XX:SurvivorRatio=8:設置 Eden 區與 Survivor 區的比例為 8,即 Eden 占用 8/10 的新生代空間,兩個 Survivor 各占 1/10。
-XX:PretenureSizeThreshold=10M:設置對象直接進入老年代的閾值為 10MB,超過這個大小的對象會直接分配到老年代。
-XX:+UseParNewGC:啟用并行新生成收集器(Parallel New Generation Collector),用于多線程環境下的新生代垃圾回收。
-XX:+UseConcMarkSweepGC:啟用并發標記清除收集器(Concurrent Mark Sweep Collector),用于多線程環境下的老年代垃圾回收。
-XX:+PrintGCDetails:打印詳細的垃圾回收日志信息。
-XX:+PrintGCTimeStamps:在垃圾回收日志中添加時間戳。

此時我們就以逐行執行的方式講解GC過程:

  • 首先代碼執行到byte[] bytes = new byte[1024 * 1024];,此時新生代空間充裕,沒有任何輸出。
  • 執行第二行代碼bytes = new byte[1024 * 1024];再次進程內存分配時,發現新生代空間不足出現以此minor gc

對應輸出結果如下,我們大體可以看出GC原因是Allocation Failure即新生代不能分配對象,觸發一次新生代GC,新生代GC前后空間由3348K變為512K,整堆空間由3348K變為1692K,最后輸出了GC耗時、系統響應耗時以及應用程序暫停時間:

2.938: [GC (Allocation Failure) 2.938: [ParNew: 3348K->512K(4608K), 0.0016244 secs] 3348K->1692K(9728K), 0.0016904 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

完成上述GC,將1M的數組存放至新生代,此時新生代的堆空間大約是1.5M:

然后第三行再次分配數組,新生代空間充裕,直接存入:

最后一次分配2M數組時,從日志中我們可以看到minor gc直接將上述的所有字節數組都回收了:

9.689: [GC (Allocation Failure) 9.689: [ParNew: 2626K->0K(4608K), 0.0021520 secs] 3806K->2746K(9728K), 0.0021903 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

在新生代空間不足嘗試到老年代分配對象時,因為堆空間且空間分配擔保失敗,不夠直接觸發FULL GC。從日志中可以看到CMS老年代GC,首先進行初始標記階段該階段為STW并找到所有的GC root,從日志中我們看到:

  • 老年代使用的容量為2718K且總容量為5120K
  • 當前堆的實際大小和總容量為4766K(9728K)標記:
2.057: [GC (CMS Initial Mark) [1 CMS-initial-mark: 2718K(5120K)] 4766K(9728K), 0.0005690 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

然后進入并發標記階段該階段不會STW,執行如下步驟:

  • CMS-concurrent-mark標記 gc root可達的老年代對象
  • CMS-concurrent-preclean該階段會處理那些dirty card中標記的對象,dirty card即臟卡,本質上那個就是處理那些并發標記階段引用關系發生變化的區域,通過在這個階段盡可能的標記可以減少最終標記即remark階段的耗時
  • CMS-concurrent-abortable-preclean即并發可終止的預清理階段,繼續執行步驟2的任務,同樣是為了減小remark階段的工作量,默認情況下CMS要求這一步必須完成Eden剩余50%或耗時超過5s才能進入下一個階段:
2.058: [CMS-concurrent-mark-start]
2.059: [CMS-concurrent-mark: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2.059: [CMS-concurrent-preclean-start]
2.059: [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2.059: [CMS-concurrent-abortable-preclean-start]
 CMS: abort preclean due to time 7.163: [CMS-concurrent-abortable-preclean: 0.005/5.105 secs] [Times: user=0.00 sys=0.00, real=5.10 secs]

最后就到了最終標記階段,該階段會STW,從日志輸出可以看出新生代占用2048k,當前這個重新標記階段Rescan 花費了0.0004620 secs,其余就是處理弱引用、卸載無用的類以及清理元數據等花費時間和耗時:

7.164: [GC (CMS Final Remark) [YG occupancy: 2048 K (4608 K)]7.164: [Rescan (parallel) , 0.0004620 secs]7.164: [weak refs processing, 0.0001727 secs]7.164: [class unloading, 0.0005772 secs]7.165: [scrub symbol table, 0.0011975 secs]7.166: [scrub string table, 0.0003404 secs][1 CMS-remark: 2718K(5120K)] 4766K(9728K), 0.0030256 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

最后就是并發的清理垃圾會重置標記,等待下一個周期的GC:

7.167: [CMS-concurrent-sweep-start]
7.168: [CMS-concurrent-sweep: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
7.168: [CMS-concurrent-reset-start]
7.168: [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

最后我們查看內存使用情況可以看到,新生代的2M就是我們最后分配的數組,在eden區,而老年代使用了1677K:

Heap
 par new generation   total 4608K, used 2089K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
  eden space 4096K,  51% used [0x00000000ff600000, 0x00000000ff80a558, 0x00000000ffa00000)
  from space 512K,   0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
  to   space 512K,   0% used [0x00000000ffa80000, 0x00000000ffa80000, 0x00000000ffb00000)
 concurrent mark-sweep generation total 5120K, used 1677K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3124K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 327K, capacity 386K, committed 512K, reserved 1048576K

三、了解JVM幾種GC的區別

  • Minor GC:發生在年輕代的空間回收,包含eden和survivor,也叫做Young GC。
  • Major GC:在老年代堆區進行空間回收。
  • Full GC:清理所有堆區的內存空間的垃圾內存,包括年輕代和老年代。

四、頻繁的minor gc問題與解決思路

1. 問題復現

我們嘗試編寫一個程序,設置該程序的堆內存新生代為5M,按照8:1:1的比例分配,這也就意為著Eden區內存大小為4M,然后S區分別是512K,這也就意味著在待分配對象加Eden區堆空間超過4M就會觸發minor gc:

基于上述說法,我們給出下面這段代碼:

public static void main(String[] args) throws Exception {
        while (true) {
            //分配3M數組
            byte[] bytes = newbyte[1024 * 1024];
            bytes = newbyte[1024 * 1024];
            bytes = newbyte[1024 * 1024];

            //創建2M的新對象觸發GC
            byte[] byte2 = newbyte[2 * 1024 * 1024];

            Thread.sleep(1000);
        }

    }

為了演示年輕代的回收行為,我們需要在對這個應用程序的年輕代堆內存改為5M,且Eden區和S區的比例為8:1:1,同時也打印GC日志信息:

-XX:NewSize=5M -XX:MaxNewSize=5M -XX:InitialHeapSize=10M -XX:MaxHeapSize=10M -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

輸出結果如下,GC日志顯示每秒基本都會觸發一次Minor GC,進而間接導致頻繁的major gc:

2. 問題拆解與修復

結合我們的配置可知,我們頻繁分配對象導致新生代進行頻繁的GC,又因為S區大小無法容納存活的對象,進而使得這些對象提前進入老年代,導致major GC也隨之頻繁,所以解決的辦法也比較簡單,按照等比例調整大堆空間,即將新生代堆空間調整至10M,保證S區各有2M空間以容納新生代存活的對象:

-XX:NewSize=10M -XX:MaxNewSize=10M -XX:InitialHeapSize=100M -XX:MaxHeapSize=100M -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

可以看到經過調整之后,基本上Minor gc就能解決問題:

3. 將年輕代空間調大,是否會更加耗時?

答案是不會的,原因有以下2點:

  • JVM操作本質上都是內存操作,相對而言不會太慢。
  • 我們將一次GC的時間拆分為t1和t2,t1是掃描年輕代空間是否有垃圾的時間,這個時間的幾乎可以忽略不計。而t2則是將eden空間存活的對象復制到survivor區的時間,這個復制操作則是t1時間的10倍。

由此可以看出,避免耗時的正確做法是合理評估新生代堆空間,減少非必要的復制操作,所以說調整新生代的空間并不會導致進一步的耗時問題。

五、頻繁的FULL GC

1. 復現問題

我們現在模擬一個場景,我們的應用中有一個定時任務,這個定時任務每隔1s會想另一個定時任務線程池中提交100個任務,每個任務都會針對Obj 對象進行方法調用:

@Component
publicclass Task {
    privatestatic Logger logger = LoggerFactory.getLogger(Task.class);


    privatestaticfinal ScheduledThreadPoolExecutor executor =
            new ScheduledThreadPoolExecutor(50,
                    new ThreadPoolExecutor.DiscardOldestPolicy());


    privatestaticclass Obj {
        private String name = "name";
        privateint age = 18;
        private String gender = "man";
        private LocalDate birthday = LocalDate.MAX;

        public void func() {
            //這個方法什么也不做
        }

//返回count個Obj對象
        private static List<Obj> getObjList(int count) {

            List<Obj> objList = new ArrayList<>(count);

            for (int i = 0; i != count; ++i) {
                objList.add(new Obj());
            }
            return objList;
        }
    }

    @Scheduled(cron = "0/1 * *  * * ? ")   //每1秒執行一次
    public void execute() {
        logger.info("1s一次定時任務");
        //向線程池提交100個任務
        Obj.getObjList(100).forEach(i -> executor.scheduleWithFixedDelay(
                i::func, 2, 3, TimeUnit.SECONDS
        ));
    }
}

完成后我們設置下面這段JVM參數后,將其啟動:

-Xms20M -Xmx20M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

不久后,控制臺出現頻繁的full gc,如果在生產環境,頻繁的full gc導致stw會導致系統吞吐量下降:

.......
1288.133: [Full GC (Allocation Failure) 1288.133: [CMS1288.142: [CMS-concurrent-preclean: 0.012/0.012 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
 (concurrent mode failure): 13695K->13695K(13696K), 0.0610050 secs] 19839K->19836K(19840K), [Metaspace: 29026K->29026K(1077248K)], 0.0610521 secs] [Times: user=0.06 sys=0.00, real=0.06 secs] 
1288.258: [Full GC (Allocation Failure) 1288.258: [CMS: 13695K->13695K(13696K), 0.0612134 secs] 19839K->19836K(19840K), [Metaspace: 29026K->29026K(1077248K)], 0.0612676 secs] [Times: user=0.06 sys=0.00, real=0.06 secs] 
1288.320: [GC (CMS Initial Mark) [1 CMS-initial-mark: 13695K(13696K)] 19836K(19840K), 0.0041303 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 
......

2. 排查思路

我們定位到程序號后,使用jstat -gc pid10000 10觀察其gc情況,可以看到每隔10s,就會增加大量的full gc:

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
640.0640.0   0.0   640.0   5504.0   665.5    13696.0    11176.2   31488.028992.64352.03889.5     39    0.08415      0.100    0.184
640.0640.0   0.0   640.0   5504.0   1487.2   13696.0    11176.2   31488.028992.64352.03889.5     39    0.08425      0.142    0.227
640.0640.0   0.0   640.0   5504.0   1697.8   13696.0    11176.2   31488.028992.64352.03889.5     39    0.08435      0.185    0.269
......

再查看jmap -heap pid查看堆區使用情況,可以看到老年代的使用率還是蠻高的:

Attaching to process ID 26176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.212-b10

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 20971520 (20.0MB)
   NewSize                  = 6946816 (6.625MB)
   MaxNewSize               = 6946816 (6.625MB)
   OldSize                  = 14024704 (13.375MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 6291456 (6.0MB)
   used     = 5088288 (4.852569580078125MB)
   free     = 1203168 (1.147430419921875MB)
   80.87615966796875% used
Eden Space:
   capacity = 5636096 (5.375MB)
   used     = 5088288 (4.852569580078125MB)
   free     = 547808 (0.522430419921875MB)
   90.28036428052326% used
From Space:
   capacity = 655360 (0.625MB)
   used     = 0 (0.0MB)
   free     = 655360 (0.625MB)
   0.0% used
To Space:
   capacity = 655360 (0.625MB)
   used     = 0 (0.0MB)
   free     = 655360 (0.625MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 14024704 (13.375MB)
   used     = 13819664 (13.179458618164062MB)
   free     = 205040 (0.1955413818359375MB)
   98.53800836010514% used

12064 interned Strings occupying 1120288 bytes.

在排除內存泄漏的問題后,我們通過jmap定位進程中導致是什么對象導致老年代堆區被大量占用:

jmap -histo 7476 | head -n 20

可以看到前20名中的對象都是和定時任務相關,有一個Task$Obj對象非常搶眼,很明顯就是因為它的數量過多導致的,此時我們就可以通過定位代碼確定如何解決,常見方案無非是: 優化代碼、增加空間兩種方式,一般來說我們都會采用代碼優化的方式去解決。

$ 

 num     #instances         #bytes  class name
----------------------------------------------
   1:         50760        3654720  java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
   2:         30799        2901552  [C
   3:         88986        2847552  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
   4:         50700        1622400  com.example.jstackTest.Task$Obj
   5:         50760        1218240  java.util.concurrent.Executors$RunnableAdapter
   6:         50700         811200  com.example.jstackTest.Task$$Lambda$587/1605553313
   7:          6391         707928  java.lang.Class
   8:         29256         702144  java.lang.String
   9:         13577         434464  java.util.concurrent.ConcurrentHashMap$Node
  10:          6363         341016  [Ljava.lang.Object;
11:          1722         312440  [B
12:          3414         230424  [I
13:             4         210680  [Ljava.util.concurrent.RunnableScheduledFuture;
14:          5223         208920  java.util.LinkedHashMap$Entry
15:          2297         202136  java.lang.reflect.Method
16:          2262         193760  [Ljava.util.HashMap$Node;
17:          5668         181376  java.util.HashMap$Node

而本次問題也很明顯,任務是一個個提交到定時任務線程池中,是由于定時任務隊列DelayedWorkQueue不斷堆積任務導致內存被打滿。所以最終改成將一個批處理一次性提交到定時任務中立刻將這一批對象回收從而避免耗時任務堆積一堆對象:

@Scheduled(cron = "0/1 * *  * * ? ")   //每1秒執行一次
    public void execute() {
        logger.info("1s一次定時任務");
        //向線程池提交100個任務


        executor.scheduleWithFixedDelay(() -> {
                    Obj.getObjList(100).forEach(i -> i.func());
                }, 2, 3, TimeUnit.SECONDS
        );


    }

3. 頻繁FULL GC的原因和解決對策

總的來說原因可以頻繁FULL GC分為3個:

  • 用戶頻繁調用System.gc():這種情況需要修改代碼即可,我們不該頻繁調用這個方法的。
  • 老年區空間過小:視情況適當擴大空間。
  • 大對象過多:這種情況視情況決定是擴大老年代空間或者將大對象拆分。

一般來說,我們優先考慮調整堆內存空間,其次才是針對業務邏輯的代碼處理進行更進一步的優化。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2012-05-15 02:04:22

JVMJava

2020-05-09 13:49:00

內存空間垃圾

2024-12-04 16:44:51

2021-06-01 09:29:43

ArthasJVM內存

2015-12-28 11:41:57

JVM內存區域內存溢出

2020-08-10 17:49:25

JVM內存溢出

2010-09-26 15:53:25

JVM內存溢出

2022-07-03 20:31:59

JVMJava虛擬機

2024-04-25 10:06:03

內存泄漏

2023-03-03 12:37:50

JavaJVM內存溢出

2021-06-02 09:55:20

JVM排查JVM內存過高技術

2019-08-29 14:29:42

JVM內存 Java

2024-08-14 14:20:00

2024-03-11 08:22:40

Java內存泄漏

2013-08-02 10:06:36

Android內存溢出

2019-04-01 14:39:32

Node.js故障排查

2018-12-04 10:54:20

JVM內存模型

2018-12-20 10:17:35

JVM模型內存溢出

2010-09-26 16:04:48

JVM內存溢出

2020-08-27 21:36:50

JVM內存泄漏
點贊
收藏

51CTO技術棧公眾號

福利91精品一区二区三区| 99久久久久久中文字幕一区| 欧美视频在线视频| 亚洲精品一卡二卡三卡四卡| 国产三级精品在线观看| 99精品国产在热久久| 中文字幕亚洲色图| youjizz.com日本| 99久久精品一区二区成人| 亚洲精品国产精品乱码不99| 欧美高清性xxxxhdvideosex| 中文字字幕在线观看| 亚洲一级黄色| 少妇高潮 亚洲精品| 亚洲男女在线观看| 国产成人免费av一区二区午夜| 欧美午夜丰满在线18影院| 中文字幕一区二区三区有限公司 | 青青青视频在线免费观看| 国产一级成人av| 8x8x8国产精品| 无码内射中文字幕岛国片| 欧美videossex另类| 欧美激情综合网| 久久精品五月婷婷| 精品人妻一区二区三区四区不卡 | 91一区二区三区| 在线不卡免费视频| 麻豆成人精品| 97热精品视频官网| 亚洲一级生活片| 成人羞羞网站| 亚洲天堂开心观看| av av在线| 欧美一区一区| 69成人精品免费视频| 热久久精品国产| 岛国av免费在线观看| 国产精品久久午夜| 日韩久久精品一区二区三区| 欧美美女色图| 久久伊人中文字幕| 精品久久久三级| 天天操天天干天天| 成人黄色大片在线观看| 97伦理在线四区| 国产高清精品软件丝瓜软件| 国产一区在线不卡| 成人写真视频福利网| 国产一区二区在线播放视频| 麻豆视频一区二区| 国产精品美女免费看| 制服丝袜在线一区| 狠狠色丁香久久婷婷综合丁香| 成人国产精品av| 国产精品羞羞答答在线| 精一区二区三区| 亚洲最大成人在线| 亚洲精品国产手机| 不卡av免费在线观看| 九九久久99| 精品视频一二三| 中文一区一区三区高中清不卡| 色姑娘综合av| 免费大片黄在线| 一区二区视频在线| 日本国产在线播放| 在线看片福利| 欧美日韩在线直播| 国产乱叫456| 国产精品99久久免费观看| 日韩av在线一区| 永久免费毛片在线观看| 午夜免费一区| 久久频这里精品99香蕉| 天天干天天干天天| 久久婷婷麻豆| 成人免费xxxxx在线观看| 成人午夜免费福利| 欧美经典一区二区| 日韩精品免费一区| 肉色欧美久久久久久久免费看| 欧美性猛交一区二区三区精品| 精品国产乱码久久久久久1区二区 91网址在线观看精品 | 日韩欧美午夜| 久久69精品久久久久久久电影好| 日本少妇做爰全过程毛片| 天堂资源在线中文精品| 成人欧美一区二区三区黑人孕妇| 懂色av成人一区二区三区| 久久伊99综合婷婷久久伊| 午夜精品视频在线观看一区二区| 色yeye免费人成网站在线观看| 欧美性高潮床叫视频| 免费黄频在线观看| 欧美女优在线视频| 久久99热精品这里久久精品| 日本免费精品视频| 福利一区在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 色呦呦在线视频| 欧美日韩一区高清| 人妻av一区二区| 97在线精品| 欧美在线播放视频| 精品人妻一区二区三区四区不卡| 国产网站一区二区三区| 国产中文字幕乱人伦在线观看| 福利视频亚洲| 亚洲免费av网址| 国产真人真事毛片| 黄网站免费久久| 日韩理论片在线观看| 欧美男人天堂| 日韩精品一区二区三区在线观看 | 国产综合亚洲精品一区二| 国产精品免费网站| 欧美xxx.com| 性欧美疯狂xxxxbbbb| av在线免费看片| 精品高清久久| 97在线日本国产| 高清国产mv在线观看| 亚洲精品视频免费观看| 亚洲欧洲日本精品| 精品一区二区三区的国产在线观看| 亚洲**2019国产| 亚洲精品国产手机| 亚洲精品高清在线观看| 婷婷激情综合五月天| 99精品在线免费在线观看| 国产精品igao视频| 欧美偷拍视频| 欧美视频第一页| 国产精品1000部啪视频| 亚洲精品1234| 国新精品乱码一区二区三区18| 18+视频在线观看| 欧美一级片在线观看| 国语对白在线播放| 精品一区二区三区免费播放 | 国产欧美成人| 久久久久国产精品视频| caoporn视频在线观看| 精品国产伦一区二区三区观看体验 | 91精品福利| 91丨九色丨国产在线| av在线看片| 欧美一级淫片007| 精国产品一区二区三区a片| 国产精品一卡二卡在线观看| 热这里只有精品| 涩爱av色老久久精品偷偷鲁| 久久久久久九九九| 免费av网站观看| 精品成人在线视频| 中文字幕成人动漫| 久久国产精品99精品国产| 自拍偷拍一区二区三区| 国产日韩欧美中文在线| 欧美激情亚洲另类| 亚洲人妻一区二区| 亚洲18色成人| 人妻精品久久久久中文| 激情欧美一区二区| 天天做天天躁天天躁| 激情亚洲另类图片区小说区| 热久久这里只有精品| 18视频免费网址在线观看| 欧美一级专区免费大片| 国产成人一区二区三区影院在线| 26uuu国产一区二区三区| 日本老熟妇毛茸茸| 97精品国产| 99re国产在线播放| 免费在线小视频| 中文字幕精品国产| www香蕉视频| 欧美性色视频在线| 极品美妇后花庭翘臀娇吟小说| 成人一区二区三区中文字幕| 国产激情在线观看视频| 欧美成熟视频| 国产综合 伊人色| 巨大黑人极品videos精品| 欧美黄色免费网站| 国产午夜在线视频| 欧美成人video| 亚洲综合成人av| 一区二区三区精品在线观看| 草草影院第一页| 国产精品99久久久| 热久久精品国产| 亚洲视频高清| 亚洲一区二区精品在线| 高清欧美性猛交xxxx黑人猛| 国产精品美女午夜av| a级片在线免费| 久久深夜福利免费观看| 欧美色综合一区二区三区| 91精品国产综合久久精品性色| 天天综合天天干| 一区二区三区欧美激情| 成人黄色免费网址| eeuss影院一区二区三区| 色播五月激情五月| 久久精品欧洲| www.射射射| 一区二区在线影院| 午夜精品福利一区二区| 亚洲另类春色校园小说| 成人激情av| 精品欧美视频| 91精品国产自产在线观看永久| 欧美片第1页| 国内精品视频久久| 在线观看电影av| 最近2019年手机中文字幕 | 欧美激情网址| 国产精品成人观看视频免费| 国产成年精品| 成人免费看黄网站| 成人精品高清在线视频| 日本国产高清不卡| 欧美男男tv网站在线播放| 久久久免费在线观看| 亚洲h片在线看| 久久精品国产亚洲7777| 色影院视频在线| 中文字幕欧美在线| 国产日韩精品在线看| 亚洲欧美在线看| 涩爱av在线播放一区二区| 亚洲国产精品久久久久久| 亚洲精品视频专区| 日韩欧美一区二区久久婷婷| 国产日韩免费视频| 91精品国产日韩91久久久久久| 91av久久久| 欧美精品一级二级三级| 国产精品一区二区人人爽| 欧美美女直播网站| 国产精品视频第一页| 欧美福利一区二区| 国产99久久九九精品无码免费| 在线不卡一区二区| 国产sm主人调教女m视频| 日韩亚洲欧美一区二区三区| www.香蕉视频| 精品国产免费人成电影在线观看四季 | 91蜜桃传媒精品久久久一区二区| 少妇饥渴放荡91麻豆| 91丨九色porny丨蝌蚪| 97伦伦午夜电影理伦片| 中文字幕乱码久久午夜不卡 | 亚洲国产一区二区在线观看| 麻豆md0077饥渴少妇| 亚洲最大黄网| 人妻激情另类乱人伦人妻| 极品日韩av| 欧美私人情侣网站| 免费成人小视频| 一个人看的视频www| 成人自拍视频在线| 国产传媒第一页| 欧美国产精品劲爆| 亚洲 欧美 变态 另类 综合| 亚洲午夜激情av| 无码任你躁久久久久久久| 欧美日韩一二区| 亚洲国产精品suv| 国产丝袜一区二区三区免费视频| 国产小视频在线观看| 久久婷婷国产麻豆91天堂| 俺来俺也去www色在线观看| 日韩美女视频免费在线观看| **国产精品| 好吊色欧美一区二区三区四区| 国产伦精品一区二区三区视频 | 国产高潮呻吟久久| 亚洲视频一区二区在线| 国产特黄大片aaaa毛片| 欧美午夜精品一区二区蜜桃| www.久久成人| 亚洲色图国产精品| av在线下载| 日韩美女在线播放| 久久9999免费视频| 久久久久一区二区| 91精品二区| 91av俱乐部| 成人天堂资源www在线| 美国黄色特级片| 亚洲成人免费观看| 国产又粗又大又爽| 日韩极品精品视频免费观看| 好了av在线| 国产不卡av在线| ccyy激情综合| 新呦u视频一区二区| 亚洲三级网站| 亚洲一区二区三区四区精品| 久久综合久久鬼色中文字| 欧美色图亚洲视频| 色婷婷综合视频在线观看| 亚洲精品一级片| 色婷婷av一区二区三区久久| 三级成人黄色影院| 国产精品综合久久久久久| 91精品亚洲| 激情五月俺来也| 2欧美一区二区三区在线观看视频| 久久国产精品波多野结衣av| 欧美日本在线观看| 久久天堂电影| 欧美影院久久久| 粉嫩的18在线观看极品精品| 久久久成人精品一区二区三区| 热久久免费视频| 91成人破解版| 欧美视频免费在线观看| 天天干天天舔天天射| 高清一区二区三区四区五区| 亚洲图色一区二区三区| 日韩不卡一二区| 精品综合久久久久久8888| 波多野结衣一二三四区| 91久久精品一区二区二区| 你懂的在线视频| 国产成人精品av| 亚洲图区在线| 动漫av免费观看| 久久精品视频一区二区| 久久久久久久久久久久久av| 亚洲第一区中文99精品| 9999在线视频| 国产一区二区精品在线| 精品二区久久| 玖玖爱在线精品视频| 午夜久久久久久久久久一区二区| 韩国av免费在线| 97视频在线播放| 色88888久久久久久影院| 国产日韩一区二区在线观看| 久久伊人中文字幕| 成人免费一级片| 日韩色av导航| 精品91福利视频| 国产精品69久久久| 99国产精品一区| www.久久久久久久| 一区二区成人精品| 欧美xxxx性| 日本久久高清视频| 国产盗摄一区二区三区| 久久久久久久久艹| 亚洲国产天堂久久综合网| 无遮挡爽大片在线观看视频| 日本成人三级| 国内成人自拍视频| 久草网视频在线观看| 亚洲精品久久久久中文字幕二区 | 91精品国产品国语在线不卡| jizzjizz亚洲| 精品免费视频123区| 日韩电影在线观看网站| 小嫩苞一区二区三区| 精品欧美一区二区久久| 成人爱爱网址| 伊人久久大香线蕉av一区| 国产1区2区3区精品美女| 99久久精品国产亚洲| 色偷偷av亚洲男人的天堂| 亚洲精品午夜| 激情六月丁香婷婷| 国产精品国产三级国产普通话三级| 精品美女www爽爽爽视频| 91蝌蚪porny九色| 国产无遮挡又黄又爽| 日韩毛片在线看| 高清久久精品| 国产a级一级片| 国产精品久久久久国产精品日日| 国产黄色美女视频| 国产精品第100页| 狠狠久久婷婷| jizz18女人高潮| 精品国产伦一区二区三区免费| 欧美日韩精品免费观看视欧美高清免费大片| 在线视频一区观看| 99国产精品视频免费观看| 国产一区二区在线播放视频| 欧美做受高潮1| 亚洲综合小说| 三年中国中文观看免费播放| 日韩精品一区国产麻豆| 国产人妖一区| 丁香啪啪综合成人亚洲| 一区二区三区国产| 成年人在线观看视频|