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

JVM 性能調優實戰指南

開發
本文通過幾個比較經典的示例演示了 JVM 進行垃圾回收的過程以及如何進行 JVM 內存調優

在當今軟件開發領域,Java 虛擬機(JVM)作為運行 Java 應用程序的核心組件,其性能優化顯得尤為重要。無論是大型企業應用還是微服務架構,高效的 JVM 調優都能顯著提升系統的響應速度、吞吐量以及穩定性。本文將從理論到實踐,全面解析 JVM 的工作原理及其關鍵配置參數,并通過實際案例分享如何進行有效的性能調優。無論您是初學者還是有經驗的開發者,相信本文都能為您帶來新的啟發與收獲。

一、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如何進行垃圾回收,注意筆者這里新生代的垃圾回收算法是ParNew而老年代用到的是CMS:

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

        //新生代空間不足,觸發full gc,新生代空間全回收,并執行CMS GC,完成后將對象存放至新生代
        byte[] byte2 = new byte[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 -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的數組存放至新生代,此時新生代的堆空間大約是1M:

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

最后一次分配2M數組時,新生代空間不足且空間分配擔保失敗,直接觸發FULL GC,從日志中我們可以看到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]

最后就是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重新并發掃描進入到老年代的對象,最后時CMS-concurrent-abortable-preclean該階段并發運行至eden區空間占用率達到滿意:

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 和major 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 = new byte[1024 * 1024];
            bytes = new byte[1024 * 1024];
            bytes = new byte[1024 * 1024];

            //創建2M的新對象觸發GC
            byte[] byte2 = new byte[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.將年輕代空間調大,是否會更加耗時?

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

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

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

五、頻繁的FULL GC

1.復現問題

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

@Component
public class Task {
    private static Logger logger = LoggerFactory.getLogger(Task.class);


    private static final ScheduledThreadPoolExecutor executor =
            new ScheduledThreadPoolExecutor(50,
                    new ThreadPoolExecutor.DiscardOldestPolicy());

 
    private static class Obj {
        private String name = "name";
        private int 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.0  640.0   0.0   640.0   5504.0   665.5    13696.0    11176.2   31488.0 28992.6 4352.0 3889.5     39    0.084  15      0.100    0.184
640.0  640.0   0.0   640.0   5504.0   1487.2   13696.0    11176.2   31488.0 28992.6 4352.0 3889.5     39    0.084  25      0.142    0.227
640.0  640.0   0.0   640.0   5504.0   1697.8   13696.0    11176.2   31488.0 28992.6 4352.0 3889.5     39    0.084  35      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
相關推薦

2017-07-21 08:55:13

TomcatJVM容器

2023-04-24 14:54:09

JVM性能調優

2012-01-10 14:35:08

JavaJVM

2019-02-19 10:25:28

JVM性能工具

2021-12-06 11:03:57

JVM性能調優

2019-11-01 08:49:07

JVM監控性能

2020-11-09 07:34:49

JVM性能監控

2013-02-28 13:37:59

系統性能調優技術實戰

2023-11-11 19:07:23

JVMJava

2025-05-27 08:20:00

Linux內核參數調優系統

2010-09-27 10:20:09

JVMLinux

2021-01-18 18:42:33

工具調優開發

2022-09-14 22:58:58

Push 推薦Java 開發vivo

2010-09-26 13:39:46

JVM調優

2010-09-26 09:08:17

JVM調優

2012-01-10 15:13:56

JavaJVM

2024-10-15 08:37:08

2012-06-20 11:05:47

性能調優攻略

2021-03-04 08:39:21

SparkRDD調優

2017-09-22 15:15:23

jvm調優命令
點贊
收藏

51CTO技術棧公眾號

欧美精品久久久久久久免费| 国产精品一区二区女厕厕| 国产人妻精品午夜福利免费| 多野结衣av一区| 久久久久9999亚洲精品| 国产噜噜噜噜噜久久久久久久久| 亚洲综合视频网站| 你懂的在线观看一区二区| 日本精品一区二区三区四区的功能| 一区二区三区欧美成人| 亚洲欧美另类综合| 日韩精品电影一区亚洲| 久久国产天堂福利天堂| 国产熟妇搡bbbb搡bbbb| 久久国产精品美女| 色综合久久中文字幕综合网| 欧美三级午夜理伦三级老人| 欧美色18zzzzxxxxx| 精品一区二区三区在线观看国产| 欧美第一淫aaasss性| 国产成人免费观看网站| 2020最新国产精品| 精品视频资源站| 欧美日韩精品在线一区二区| gogo在线观看| 国产欧美日韩久久| 久久久精品动漫| 国产精品羞羞答答在线| 日韩影院精彩在线| 91精品国产精品| 日韩一级片大全| 成人短片线上看| 亚洲精品福利免费在线观看| а 天堂 在线| 成人在线免费| 色妹子一区二区| 精品少妇一区二区三区在线| 成人三级网址| 中文字幕中文在线不卡住| 欧美日韩精品综合| 少妇无码一区二区三区| 国产精品一区二区视频| 国产一区在线播放| 中文字幕你懂的| 久久天天综合| 浅井舞香一区二区| 国产精品视频免费播放| 欧美一区影院| 久久av在线播放| 激情高潮到大叫狂喷水| 日本道不卡免费一区| 国产一区二区三区在线看| 黄色aaa视频| 一区二区美女| 亚洲免费一在线| 四虎永久免费影院| 欧美精美视频| 亚洲人午夜精品免费| 偷拍女澡堂一区二区三区| 久久悠悠精品综合网| 精品国产免费视频| 免费看毛片的网站| 女同另类激情重口| 亚洲精品自产拍| 公肉吊粗大爽色翁浪妇视频| 国内成人自拍| 色777狠狠综合秋免鲁丝| 综合 欧美 亚洲日本| 日韩欧美高清在线播放| 色偷偷偷综合中文字幕;dd| 精品少妇一区二区三区| 欧美日韩亚洲免费| 欧美美女搞黄| 国产精品美女久久久久久久久久久| 日本一区二区三区www| 91在线播放网站| 国产精品久久久久婷婷二区次| 在线不卡视频一区二区| 成人短视频在线| 亚洲第一激情av| 久久美女福利视频| 国产电影一区二区三区爱妃记| 欧美日韩国产一区| 中文字幕1区2区| 欧美深夜视频| 中文字幕亚洲欧美一区二区三区| av最新在线观看| 亚洲激情二区| 国产精品久久久久久久久久| 国产精品一区二区人人爽| 国产成人av影院| 欧美精品一区二区视频| 蜜桃视频网站在线| 亚洲高清免费观看| 久久婷婷国产91天堂综合精品| 在线播放成人| 亚洲欧美国产视频| 日韩激情小视频| 亚洲女人av| 91色在线视频| 黄色片在线播放| 一区二区三区精品| 冲田杏梨av在线| 欧美韩一区二区| 精品国偷自产在线视频| 久久久久久久久久影院| 毛片基地黄久久久久久天堂| 国产在线一区二| 午夜精品一区| 国产真实有声精品录音| 欧美性猛交xxxx| 午夜av中文字幕| 九九热精品视频在线观看| 欧美超级免费视 在线| 五月天婷婷导航| 风间由美一区二区三区在线观看| 日韩精品无码一区二区三区| av福利在线导航| 欧美日韩国产另类一区| 51调教丨国产调教视频| 亚洲一级淫片| 国产精品国模在线| 图片区 小说区 区 亚洲五月| 国产精品网曝门| 美女福利视频在线| 粉嫩精品导航导航| 乱亲女秽乱长久久久| 国产情侣免费视频| 91丨porny丨户外露出| 免费观看亚洲视频| 日韩国产91| 中文字幕视频在线免费欧美日韩综合在线看 | 国产av自拍一区| 伊人蜜桃色噜噜激情综合| 国产一区二区丝袜| av中文字幕一区二区三区| 欧美视频中文字幕在线| 年下总裁被打光屁股sp| 亚洲影视一区| 成人羞羞国产免费| 含羞草www国产在线视频| 欧美视频你懂的| 黄色aaa视频| 久色成人在线| 欧美成人一区二区在线| 最近高清中文在线字幕在线观看1| 日韩欧美色综合网站| 91杏吧porn蝌蚪| 国产真实乱对白精彩久久| 夜夜爽99久久国产综合精品女不卡| 原纱央莉成人av片| 亚洲欧美日韩中文视频| 国产久一一精品| 亚洲国产无线乱码在线观看| 久久久影视传媒| 不卡影院一区二区| 国产探花一区| 国产精品视频午夜| 免费成人黄色| 91精品国产综合久久久久久 | 亚洲第一页视频| 夜夜嗨av一区二区三区中文字幕| 91视频免费入口| 一区免费在线| 久久久久久久久久久久久9999| 深夜成人在线| 亚洲视频免费一区| 中文字幕网址在线| 亚洲欧美日韩综合aⅴ视频| 永久av免费在线观看| 亚洲高清免费| 欧美凹凸一区二区三区视频| 欧美日韩在线精品一区二区三区激情综合 | 深夜福利视频网站| 日韩欧美在线视频免费观看| 国产1区2区在线观看| 久久电影国产免费久久电影| 一二三在线视频| 国产精品丝袜在线播放| 2019中文字幕在线| www 日韩| 精品久久一区二区| 天天综合天天干| 中文字幕亚洲在| 精品1卡二卡三卡四卡老狼| 久久精品人人做人人爽电影蜜月| 亚洲一区二区在线看| 欧洲精品99毛片免费高清观看 | 一区二区精品免费视频| 欧美大片91| 欧美在线亚洲一区| 精品孕妇一区二区三区| 欧美大片1688| 日韩免费一区二区| 亚洲熟女综合色一区二区三区| 欧美国产日韩在线观看| 超碰在线超碰在线| 久久xxxx| 99久久免费观看| 精品一区二区三| 国产精品12| 涩涩涩久久久成人精品| 国内精久久久久久久久久人| 在线免费观看黄色av| 亚洲国产成人在线播放| 亚洲自拍偷拍另类| 欧美日韩国产在线看| 免费在线观看黄色小视频| 91在线精品秘密一区二区| 手机免费av片| 日韩精品1区2区3区| 日本xxxxxxxxxx75| 999国产精品视频| 欧美日产一区二区三区在线观看| 亚洲精品一区二区三区在线| 国产精品91久久久| 黄在线观看免费网站ktv| 久久亚洲私人国产精品va| 理论视频在线| 亚洲黄页网在线观看| 午夜精品久久久久久久第一页按摩| 欧美性猛交一区二区三区精品| 国产精选第一页| 亚洲欧美日韩在线不卡| 99久久99久久精品免费看小说.| 99国产精品久久| 理论片大全免费理伦片| 国产精品99久久久久久久vr| 久久人人爽av| 免费成人av在线播放| 亚洲色精品三区二区一区| 亚洲国产片色| 成人一级生活片| 中文字幕一区二区三区在线视频| 亚洲午夜精品一区二区三区| 九九久久电影| 欧美二区在线看| 一本色道久久综合亚洲精品酒店 | 国产精品69精品一区二区三区| 草美女在线观看| 欧美麻豆久久久久久中文 | 午夜精品福利影院| 国产精品青青草| av不卡一区| 国产乱码一区| 老司机在线精品视频| 国产精品裸体一区二区三区| jizz性欧美23| 国产精品一区二区免费| www.亚洲一二| 国内不卡一区二区三区| 久久悠悠精品综合网| 精品亚洲欧美日韩| 色老板在线视频一区二区| 极品尤物一区二区三区| 日韩三级毛片| 牛人盗摄一区二区三区视频| 美女精品一区最新中文字幕一区二区三区| 久久久久久亚洲精品不卡4k岛国 | 亚洲精品国精品久久99热一| 一级久久久久久久| 正在播放一区二区| 国产极品久久久| 精品日韩成人av| 五月婷婷在线观看视频| 亚洲美女av网站| eeuss影院www在线播放| 中文字幕亚洲色图| xvideos国产在线视频| 色综合久久久久久中文网| brazzers在线观看| 清纯唯美亚洲综合| 欧美韩国亚洲| 亚洲japanese制服美女| 国产另类在线| 青青影院一区二区三区四区| 日韩毛片视频| 国产xxxx振车| 日日嗨av一区二区三区四区| 天天干天天玩天天操| 国产精品99久久久久久似苏梦涵| 大尺度做爰床戏呻吟舒畅| 2020国产成人综合网| 99热6这里只有精品| 亚洲影院理伦片| 黄色在线观看国产| 欧美福利视频导航| 色婷婷av一区二区三区之红樱桃 | 麻豆成人精品| 不卡的在线视频| www.亚洲色图| 美国美女黄色片| 亚洲综合在线第一页| 亚洲日本视频在线观看| 欧美乱妇15p| 欧美 日韩 国产 在线| 亚洲香蕉成人av网站在线观看 | 亚洲精品乱码久久久久久日本蜜臀| 日韩精品一区三区| 欧美精品 日韩| 深夜福利在线看| 久久夜精品香蕉| 电影一区二区三| 97人人做人人人难人人做| 免费成人网www| 欧美亚洲黄色片| 麻豆久久久久久久| www.久久国产| 一区二区成人在线视频| 亚洲国产无线乱码在线观看| 亚洲精品动漫100p| 欧美性猛片xxxxx免费中国| 国产精品电影久久久久电影网| a级日韩大片| 中文字幕第50页| 青草av.久久免费一区| 你懂的在线观看网站| 一区二区视频在线| 这里只有精品9| 亚洲欧美国产一区二区三区| 国内在线视频| 亚洲a级在线观看| 国产国产精品| 久久撸在线视频| 国产喂奶挤奶一区二区三区| 亚洲精品在线观看av| 91精品在线免费| av网站在线播放| 热久久免费视频精品| 精品人人人人| 男人添女荫道口女人有什么感觉| 精品一区二区日韩| 欧美a在线播放| 色哟哟日韩精品| 日韩在线无毛| 97高清免费视频| 懂色av一区二区| 激情六月天婷婷| 国产乱国产乱300精品| 欧美美女性生活视频| 欧美日韩中文精品| 99免在线观看免费视频高清| 欧美最猛性xxxxx(亚洲精品)| 美女一区2区| 水蜜桃色314在线观看| 成人av电影在线| 日韩av在线播| 亚洲精品国精品久久99热一| 激情视频网站在线播放色| 精品一区2区三区| 欧美一级网站| 91精品国自产在线| 欧美日韩国产高清一区二区三区| 777电影在线观看| 国产日韩欧美自拍| 亚洲高清影视| 日韩精品国产一区| 亚洲成av人片在线观看无码| 天堂中文字幕av| 久久久亚洲天堂| 私拍精品福利视频在线一区| 国产女女做受ⅹxx高潮| 日本一区二区综合亚洲| 中文字幕免费观看视频| 久久久精品999| 日韩精品中文字幕一区二区| 2019日韩中文字幕mv| 久久这里只有精品首页| 免费在线不卡av| 久久成人这里只有精品| 国产伦理久久久久久妇女| 亚洲熟女乱色一区二区三区| 国产女主播一区| av一区二区三| 91国内免费在线视频| 成人影院在线| 日本少妇激三级做爰在线| 亚洲成人av免费| 精彩国产在线| 亚洲伊人成综合成人网| 亚洲美女啪啪| 一区二区三区在线播放视频| 日韩欧美一区二区在线视频| 欧美freesex黑人又粗又大| 色一情一乱一伦一区二区三欧美 | 一区二区三区福利| 性の欲びの女javhd| 日韩欧美国产综合在线一区二区三区 | 国产日韩v精品一区二区| 国产伦精品一区二区三区视频痴汉 | 亚洲综合影视| 欧美午夜精品久久久久免费视| 激情综合色播五月| 毛片视频网站在线观看| 最近的2019中文字幕免费一页| 草草视频在线一区二区| 免费一级特黄录像| 亚洲va在线va天堂| 1769在线观看| 国产视频在线观看一区|