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

來聊聊守護線程和 JVM 的優(yōu)雅關(guān)閉

開發(fā)
本文我們的虛擬機鉤子、守護線程、finalize三個角度針對Java程序優(yōu)雅關(guān)閉的哲學(xué)進行一些實踐演示和建議,希望對你有幫助。

本文原本是針對守護線程的一些探討,感覺知識點稍顯淺薄,故基于原有文章進行迭代補充對于Java程序優(yōu)雅關(guān)閉的一些思考。

一、JVM中的關(guān)閉

1. 詳解虛擬機鉤子

在Java進程開發(fā)中,對于重量級的系統(tǒng)資源關(guān)閉或者進程資源整理或信號輸出,常常會通過Java內(nèi)置的addShutdownHook方法注冊回調(diào)函數(shù),確保在Java進程關(guān)閉不再使用這些資源時將其釋放,例如hutool這個工具類對應(yīng)連接池的管理工具GlobalDSFactory,其底層就會在類加載初始化時利用addShutdownHook注冊一個連接池銷毀的回調(diào)函數(shù):

/*
  * 設(shè)置在JVM關(guān)閉時關(guān)閉所有數(shù)據(jù)庫連接
  */
 static {
  // JVM關(guān)閉時關(guān)閉所有連接池
  Runtime.getRuntime().addShutdownHook(new Thread() {
   @Override
   public void run() {
    if (null != factory) {
     factory.destroy();
     StaticLog.debug("DataSource: [{}] destroyed.", factory.dataSourceName);
     factory = null;
    }
   }
  });
 }

而虛擬機鉤子注冊的原理本質(zhì)上就是在調(diào)用addShutdownHook時,其底層將這個現(xiàn)場hook注冊到一個hooks的map容器中,并在shutdown的時候遍歷調(diào)用這些hook線程:

對應(yīng)的我們也給出addShutdownHook的實現(xiàn),可以看到其底層就是調(diào)用ApplicationShutdownHooks來注冊hook:

public void addShutdownHook(Thread hook) {
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("shutdownHooks"));
        }
        ApplicationShutdownHooks.add(hook);
    }

而步入這個add方法后可以看到其內(nèi)部本質(zhì)上就是在必要的校驗后,存入到hooks這個map中:

private static IdentityHashMap<Thread, Thread> hooks;

static synchronized void add(Thread hook) {
        if(hooks == null)
            throw new IllegalStateException("Shutdown in progress");

        if (hook.isAlive())
            throw new IllegalArgumentException("Hook already running");

        if (hooks.containsKey(hook))
            throw new IllegalArgumentException("Hook previously registered");

        hooks.put(hook, hook);
    }

當(dāng)觸發(fā)虛擬機鉤子關(guān)閉時,其內(nèi)部就會針對hooks進行遍歷并按照如下邏輯處理:

  • 將hook線程啟動,執(zhí)行hook邏輯
  • 調(diào)用join確保該hook能夠準(zhǔn)確執(zhí)行完成
static void runHooks() {
        Collection<Thread> threads;
        synchronized(ApplicationShutdownHooks.class) {
            threads = hooks.keySet();
            hooks = null;
        }
  //遍歷hook線程啟動
        for (Thread hook : threads) {
            hook.start();
        }
        for (Thread hook : threads) {
            while (true) {
                try {
                //調(diào)用join加入主線程確保當(dāng)前線程能夠正確執(zhí)行完成
                    hook.join();
                    break;
                } catch (InterruptedException ignored) {
                }
            }
        }
    }

當(dāng)所有關(guān)閉鉤子都執(zhí)行結(jié)束時,如果runFinalizersOnExit為true,那么JVM就會運行終結(jié)器finalizers,此時JVM并不會停止或者關(guān)閉仍然在運行的應(yīng)用線程。直到最終JVM結(jié)束,應(yīng)用線程才會被關(guān)閉,對應(yīng)的我們可以在源碼Shutdown的exit方法印證:

static void exit(int status) {
        boolean runMoreFinalizers = false;
        synchronized (lock) {
             //......
            case FINALIZERS:
                if (status != 0) {
                    /* Halt immediately on nonzero status */
                    halt(status);
                } else {
                   //......
                   //將runFinalizersOnExit賦值給runMoreFinalizers 
                    runMoreFinalizers = runFinalizersOnExit;
                }
                break;
            }
        }
        //如果runMoreFinalizers 為true,則運行終結(jié)器
        if (runMoreFinalizers) {
            runAllFinalizers();
            halt(status);
        }
        //......
    }

2. 虛擬機鉤子串行化使用

需要注意的虛擬機鉤子注冊后的調(diào)用時機,當(dāng)JVM執(zhí)行關(guān)閉鉤子的時候,如果守護或者非守護線程也在運行,那么虛擬機鉤子就可能和這些線程并發(fā)的執(zhí)行,即虛擬機鉤子可能會并行的執(zhí)行一些工作,所以對于一些存在依賴性的共享數(shù)據(jù)操作,虛擬機鉤子要慎重使用。

例如我們用虛擬機鉤子將日志服務(wù)關(guān)閉,此時如果另外的虛擬機鉤子需要使用日志打印,可能就會報錯:

例如我們的日志框架LogService ,本質(zhì)上就是對于文件流的寫入和關(guān)閉:

static class LogService {

        private static final BufferedWriter writer = FileUtil.getWriter("F:\\tmp\\log.txt", Charset.defaultCharset(), true);

        @SneakyThrows
        public void log(String msg) {//將數(shù)據(jù)寫入日志中
            writer.write(msg);
        }


        public void close() {
            try {
                writer.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

如下圖所說,若在虛擬機鉤子上注冊關(guān)閉打印和關(guān)閉日志框架的鉤子,就有可能出現(xiàn)打印鉤子拋出stream close的錯誤:

LogService logService = new LogService();



        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            //拋出stream close的錯誤
            logService.log("hello world");
        }));

        /**
         * 注冊虛擬機鉤子
         */
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            //執(zhí)行一些應(yīng)用程序的資源關(guān)閉
            logService.close();
        }));

總的來說,使用虛擬機鉤子必須注意:

  • 虛擬機鉤子要保證線程安全,即針對共享資源做好同步把控
  • 虛擬機鉤子盡量串行化執(zhí)行,且鉤子之間不可以有任何依賴
  • 關(guān)閉鉤子應(yīng)該盡快的退出,因為它直接的決定的JVM退出的結(jié)束時間

二、守護線程

1. 守護線程的基本概念

很多人對守護線程都不陌生,對于守護線程大部分讀者都停留在JDK官方文檔所介紹的概念:

The Java Virtual Machine exits when the only threads running are all daemon threads.

文檔的意思是當(dāng)JVM中不存在任何一個正在運行的非守護線程時,JVM進程會直接退出。

讀起來很拗口對不對,沒關(guān)系,本文就會基于幾個代碼示例,讓你更深層次的理解守護線程。在此之前,讀者不妨自測一下,下面這幾道面試題:

  • 守護線程和普通線程有什么區(qū)別?
  • 守護線程默認(rèn)優(yōu)先級是多少?
  • 若父線程為守護線程,在其內(nèi)部創(chuàng)建一個普通線程,父線程停止,子線程是否也會停止呢?
  • 如何創(chuàng)建守護線程池?
  • 守護線程使用有哪些注意事項?

2. 守護線程和普通線程的區(qū)別

要了解區(qū)別就先來了解一下兩者的使用,非守護線程,也就我們?nèi)粘?chuàng)建的普通線程,可以看到這段代碼創(chuàng)建了一個普通線程,在無限循環(huán)的定時輸出內(nèi)容,而主線程僅僅是輸出一段文字后就不做任何動作了。

public static void main(String[] args) {

        Thread t = new Thread(() -> {
            while (true) {
                log.info("普通線程執(zhí)行了......");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t.start();
       log.info("主線程運行結(jié)束");


    }

對應(yīng)的輸出結(jié)果如下,可以看到,即使主線程停止運行了,而非守護線程也仍然會在運行,也就是JDK官方文檔的字面含義,普通線程不停止,JVM就不停止運行:

12:44:57.022 [Thread-0] INFO com.sharkChili.webTemplate.Main - 普通線程執(zhí)行了......
12:44:57.022 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束
12:45:02.031 [Thread-0] INFO com.sharkChili.webTemplate.Main - 普通線程執(zhí)行了......

基于上述代碼,用setDaemon(true)將該線程設(shè)置為守護線程:

public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                log.info("守護線程執(zhí)行了......");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        //設(shè)置當(dāng)前線程為守護線程
        t.setDaemon(true);
        t.start();
        log.info("主線程運行結(jié)束");
    }

輸出結(jié)果如下,可以看到隨著主線程的消亡,守護線程也會隨之停止,不再運行,自此我相信讀者可以理解JDK官方文檔所說的那句話了,只要有一個普通線程在,JVM就不會退出,只要所有普通線程停止工作,JVM自動退出,守護線程也會自動結(jié)束。

12:44:23.239 [Thread-0] INFO com.sharkChili.webTemplate.Main - 守護線程執(zhí)行了......
12:44:23.239 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束

3. 守護線程和普通線程優(yōu)先級的區(qū)別

我們可以通過getPriority方法查看兩者的區(qū)別:

public static void main(String[] args) {

        Thread t = new Thread(() -> {

            log.info("守護線程優(yōu)先級:{}", Thread.currentThread().getPriority());
        });

        //設(shè)置當(dāng)前線程為守護線程
        t.setDaemon(true);
        t.start();
        log.info("主線程運行結(jié)束,當(dāng)前線程運行優(yōu)先級:{}", Thread.currentThread().getPriority());


    }

從輸出結(jié)果來看,兩者的優(yōu)先級是一樣的,都為5:

12:54:36.344 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束,當(dāng)前線程運行優(yōu)先級:5
12:54:36.344 [Thread-0] INFO com.sharkChili.webTemplate.Main - 守護線程優(yōu)先級:5

4. 父守護線程問題

我們創(chuàng)建了一個守護線程,在其runnable實現(xiàn)中創(chuàng)建一個子線程:

public static void main(String[] args) {

        Thread parentThread = new Thread(() -> {
            Thread childThread = new Thread(() -> {
                while (true) {
                    log.info("子線程運行中,是否為守護線程:{}",Thread.currentThread().isDaemon());
                    try {
                        TimeUnit.HOURS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            });

            childThread.start();

            log.info("parentThread守護線程運行中");
        });

        //設(shè)置當(dāng)前線程為守護線程
        parentThread.setDaemon(true);
        parentThread.start();
        log.info("主線程運行結(jié)束");


    }

從輸出結(jié)果來看,父線程為守護線程時,其內(nèi)部創(chuàng)建的子線程也為守護線程,所以隨著父線程的銷毀,子線程也會同步銷毀。

00:05:56.869 [Thread-1] INFO com.sharkChili.webTemplate.Main - 子線程運行中,是否為守護線程:true
00:05:56.869 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束
00:05:56.869 [Thread-0] INFO com.sharkChili.webTemplate.Main - parentThread守護線程運行中

5. 守護線程池的創(chuàng)建

public static void main(String[] args) {

        ExecutorService threadPool = Executors.newFixedThreadPool(10, ThreadFactoryBuilder.create()
                .setNamePrefix("worker-")
                .setDaemon(true)
                .build());
        threadPool.execute(()->{
            while (true){
                try {
                    log.info("守護線程運行了");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        log.info("主線程退出");


    }

6. 守護線程的使用場景

因為守護線程擁有自動結(jié)束自己生命周期的特性,當(dāng)JVM中沒有一個普通線程運行時,JVM會退出,即所有守護線程會自動停止,所以守護線程的使用場景可以有以下幾種:

  • 垃圾回收線程就是典型的守護線程,在后臺進行垃圾對象回收的工作。
  • 非核心業(yè)務(wù)工作可交由守護線程,例如:各類信息統(tǒng)計、服務(wù)監(jiān)控等,一旦進程結(jié)束運行則這些守護線程停止工作。

7. 守護線程注意事項

  • 復(fù)雜計算、資源回收這種不建議使用守護線程。
  • setDaemon要在start方法前面,否者該設(shè)置會不生效。

三、finalize關(guān)閉的哲學(xué)

1. 基本介紹

針對一些系統(tǒng)資源例如文件句柄或者套接字句柄,當(dāng)不需要它們時,垃圾回收器定義了finalize方法進行一些資源關(guān)閉,一旦垃圾回收器回收這些對象之后,對應(yīng)的資源就會調(diào)用finalize釋放。

例如FileInputStream的finalize方法,它就會檢查當(dāng)前文件句柄是否非空,然后顯示的調(diào)用一下close方法:

protected void finalize() throws IOException {
        if ((fd != null) &&  (fd != FileDescriptor.in)) {
           //關(guān)閉文件句柄
            close();
        }
    }

2. 終結(jié)器注意事項和正確資源關(guān)閉姿勢

需要注意的finalize在JVM運行中可能會執(zhí)行也可能不會執(zhí)行,JVM對此無法做出保證,所以它運行時存著極端的不確定性,所以進行資源關(guān)閉時,我們非常不建議使用finalize。

正確的一些系統(tǒng)資源關(guān)閉回收,筆者更建議是使用階段采用try-with-resource手動關(guān)閉資源:

//使用try-with-resource手動關(guān)閉資源
try(BufferedReader reader = FileUtil.getUtf8Reader("filePahth")){
            System.out.println(reader.readLine());
        }catch (Exception e){
            //異常處理
        }
責(zé)任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2021-01-19 10:35:49

JVM場景函數(shù)

2022-04-11 08:17:07

JVMJava進程

2021-03-28 09:17:18

JVM場景鉤子函數(shù)

2025-06-11 08:20:00

JVM線程代碼

2024-11-13 16:37:00

Java線程池

2024-10-14 14:28:19

支付系統(tǒng)設(shè)計

2023-12-20 10:04:45

線程池Java

2024-08-07 08:22:27

2023-09-01 08:59:57

2024-02-04 09:00:00

向量查詢數(shù)據(jù)檢索MyScale

2021-05-06 08:11:03

Java用戶線程守護線程

2020-02-24 21:43:36

avaJVM 級鎖線程安全

2024-02-21 08:19:54

2023-10-20 08:00:55

PodRainbow部署

2024-04-24 12:34:08

Spring事務(wù)編程

2023-07-14 12:28:07

JVM優(yōu)化操作

2021-04-20 08:00:31

Redisson關(guān)閉訂單支付系統(tǒng)

2025-01-13 06:00:00

Go語言gRPC

2022-10-12 09:01:52

Linux內(nèi)核線程

2025-07-23 07:09:38

點贊
收藏

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

日本成人网址| 欧美激情精品久久久久久大尺度| 亚洲乱码av中文一区二区| 日韩在线三级| 国产精品99精品无码视| 国外av在线| 欧美性色综合| 18成人在线观看| 久久亚洲精品毛片| 丝袜制服一区二区三区| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 亚洲丝袜自拍清纯另类| 久久全国免费视频| 少妇性饥渴无码a区免费| 久久久免费高清视频| 日本高清久久| 亚洲欧美一区二区在线观看| 91传媒免费看| 91在线播放观看| 99精品女人在线观看免费视频| 韩国成人在线视频| 色偷偷偷综合中文字幕;dd| 国产成人精品无码播放| jizz中国女人| 888久久久| 在线播放日韩导航| 亚洲AV无码成人精品一区| 在线免费观看高清视频| 日韩欧美伦理| 欧美日本一区二区三区四区| 国产日韩欧美精品| 久久精品视频国产| 图片小说视频色综合| 欧美美女视频在线观看| 在线播放 亚洲| 国产一区二区在线视频聊天| 日韩中字在线| 日韩精品视频免费| 欧美少妇在线观看| 国产偷拍一区二区| 国产精品嫩草影院在线看| 欧美日韩国产一区中文午夜| 久久av免费观看| 黄色片网站在线免费观看| 正在播放日韩欧美一页| 欧美成人三级在线| 国产欧美日韩网站| 欧美捆绑视频| 蜜桃精品视频在线| 不卡伊人av在线播放| 亚欧精品视频一区二区三区| 成人综合日日夜夜| 亚洲午夜免费视频| 91网站在线看| 国产大片免费看| 日韩激情一区| 三级精品视频久久久久| 丰满少妇一区二区三区专区| 国产综合视频一区二区三区免费| 麻豆91精品91久久久的内涵| 欧美成人性生活| www国产视频| 伊人春色在线观看| 波多野结衣在线一区| 日本久久91av| 欧美一区二区三区观看| 视频一区日韩| 日韩欧美色综合网站| 日日碰狠狠躁久久躁婷婷| 亚洲天堂资源| 久久久亚洲精品一区二区三区| 97精品伊人久久久大香线蕉| 亚洲午夜精品久久久久久高潮| 欧美一级大黄| 一区二区三区国产豹纹内裤在线| 成人h视频在线观看播放| 免费无遮挡无码永久在线观看视频 | 国产精品99re| 国产视频一区免费看| 揄拍成人国产精品视频| 亚洲一区二区三区四区av| 影音成人av| 中文字幕精品一区| 国产精品日韩欧美一区二区| 中文字幕一区二区三区免费看| 精品国产99| 精品国产三级电影在线观看| 亚洲欧洲日本精品| 国产cdts系列另类在线观看| 91美女片黄在线| 亚洲一区二区免费| 伊人22222| 国产精品一区在线| 国内精品久久久久影院优 | 日本少妇在线观看| 久久资源中文字幕| 亚洲日本中文字幕| 熟女人妻在线视频| 成人爽a毛片| 欧美一区二区三区公司| 91制片厂毛片| 久久爱91午夜羞羞| 欧美日韩精品免费观看视频| 毛葺葺老太做受视频| 男人添女人下部高潮视频在线观看| 91在线视频网址| 97se国产在线视频| 国产按摩一区二区三区| 99re8在线精品视频免费播放| 成人黄色片视频网站| 亚洲天堂中文网| 成人在线视频一区二区| 亚洲综合色av| 男女视频在线观看免费| 亚洲美女屁股眼交3| 中文字幕一区二区三区有限公司| 亚洲国产综合一区| 国内精品在线播放| 亚洲精品免费网站| 香蕉视频黄在线观看| 成人va在线观看| 亚洲一二三区精品| 婷婷在线视频| 国产精品免费久久| 国产日韩欧美精品| 免费黄色网址在线观看| 精品久久香蕉国产线看观看gif| 婷婷五月色综合| 亚洲成人中文字幕在线| 国产色产综合产在线视频 | 国产免费不卡| 在线一区二区三区| 国产极品美女高潮无套久久久| 欧美aa在线| 偷拍与自拍一区| 国产精品无码专区av在线播放| 素人一区二区三区| 这里只有精品99re| 1024在线看片| 日韩专区在线视频| 国产精品黄色av| 中文字幕精品一区二区精| 99久久精品国产观看| 国产 国语对白 露脸| www成人免费观看| 欧美日韩亚洲天堂| 少妇一级淫片免费放播放| 欧美午夜电影在线观看| 99久久无色码| a篇片在线观看网站| 69堂国产成人免费视频| 开心激情五月网| 欧美日韩播放| 日韩av影视综合网| 久草网在线观看| 国产成人免费在线视频| 久久久久se| 五月天av在线| 欧美蜜桃一区二区三区| 在线看片中文字幕| 久久aⅴ国产欧美74aaa| 国产精品区一区| 美足av综合网| 亚洲第一级黄色片| 内射毛片内射国产夫妻| 日本成人中文字幕在线视频 | 亚洲自拍中文字幕| www.在线视频| 欧美大片在线观看| 国产成人啪精品午夜在线观看| 美腿丝袜亚洲色图| 国产精品亚洲天堂| www.欧美| 欧美精品成人在线| 91aaa在线观看| 亚洲免费婷婷| 亚洲xxxx做受欧美| 免费av不卡在线观看| 亚洲精品成人久久| 手机av在线看| 美日韩精品视频| 99免费在线观看视频| 春色校园综合激情亚洲| 亚洲精品视频二区| 久久久久久国产精品视频| 日产欧产美韩系列久久99| 国产在线精品一区| 18网站在线观看| 亚洲电影在线看| 区一区二在线观看| 粉嫩欧美一区二区三区高清影视| julia一区二区中文久久94| 蜜臀av在线播放| 亚洲色图在线观看| 精品人妻一区二区三区换脸明星| 国产·精品毛片| 尤物av无码色av无码| 日韩成人在线观看视频| 51视频国产精品一区二区| 国产成人精品av在线观| 午夜精品123| 亚洲少妇中文字幕| 欧美在线高清| 亚洲综合中文字幕68页| 黄色网页在线看| 偷窥国产亚洲免费视频| 三年中国中文观看免费播放| 国产成人高清视频| 精品久久久噜噜噜噜久久图片 | 超碰高清在线| 综合网中文字幕| 五月天婷婷久久| 91亚洲精华国产精华精华液| 久久久久久久久久一区二区| 成人激情在线| 国产精品久久久久久久久久小说| 国产成人三级在线播放| 欧美日韩一区二区三区在线免费观看| 亚洲色图14p| 国产视频一区三区| 亚洲一区二区精品在线观看| 日韩毛片网站| 久久久久www| 久久国产视频一区| 一区二区三区在线观看国产| 亚洲最大视频网| 亚洲精品美女| 欧美激情第六页| 秋霞在线视频| 中文字幕亚洲情99在线| 天堂在线一二区| 欧美性生活大片免费观看网址| 欧洲美女亚洲激情| 一区二区三区四区电影| 日韩一区二区电影在线观看| 欧美做受69| 国产精品久久久久久久久久尿| www 日韩| 91精品黄色片免费大全| 男人的天堂av网站| 中文字幕一区免费在线观看| 国产无套内射久久久国产| 国产精品av久久久久久麻豆网| 久久国产精品一区二区三区四区| 全球最大av网站久久| 欧美亚洲激情视频| 免费高潮视频95在线观看网站| 国产一区二区精品丝袜| 亚洲中文字幕在线观看| 在线观看免费一区| 青青草国产在线观看| 最新欧美精品一区二区三区| 一级二级黄色片| 蜜桃久久久久久| 亚洲老女人av| 亚洲精品影视| 国产精品自拍片| 日本女优一区| 国产一区二区三区四区五区在线 | 国产日韩在线观看视频| 国产日韩在线视频| 蜜桃成人365av| 久久久久久久97| 成年人国产在线观看| 在线成人免费网站| 亚洲欧美强伦一区二区| 欧美丝袜第一区| 欧美黑人精品一区二区不卡| 亚洲啪啪综合av一区二区三区| 色一情一交一乱一区二区三区 | www青青草原| 亚洲精品国产视频| 日韩三级一区二区三区| 国产丝袜在线精品| 成人做爰69片免网站| 中文字幕中文字幕一区| 我家有个日本女人| 午夜欧美大尺度福利影院在线看| 日韩欧美国产成人精品免费| 一区二区三区免费在线观看| 日本熟伦人妇xxxx| 在线视频你懂得一区| 国产尤物在线视频| 中文字幕日韩一区二区| 九九视频在线观看| 欧美日韩午夜视频在线观看| 国产精品自拍第一页| 777色狠狠一区二区三区| 日韩av免费播放| 日韩欧美在线一区二区三区| 中国一级特黄视频| 日韩欧美一级片| 免费在线观看污视频| 久久天天躁狠狠躁老女人| 国产三级电影在线播放| 国产欧美日韩精品专区| 日韩在线免费| 91高潮精品免费porn| 久久香蕉av| 国产精品69av| 乡村艳史在线观看| 成人av电影天堂| 少妇一区二区三区| 久久www免费人成精品| 成人午夜国产| 免费av手机在线观看| 日韩视频一区| 国产精品国产对白熟妇| 欧美涩涩视频| 亚洲第一狼人区| 99精品热视频| ass精品国模裸体欣赏pics| 成人av在线资源| 欧美日韩中文字幕视频| 婷婷综合另类小说色区| 国产一区二区99| 91精品国产日韩91久久久久久| 国产jzjzjz丝袜老师水多| 亚洲人成电影网站色www| 99re在线视频| 尤物精品国产第一福利三区 | 欧美日韩一区在线视频| 欧美在线三级| 999这里有精品| 国产三区在线成人av| 天堂在线免费观看视频| 精品免费国产二区三区| 免费在线看黄色| 国产精品扒开腿做爽爽爽男男| 欧美一级在线| 日韩av电影免费播放| 国产一区二区你懂的| 无限资源日本好片| 国产亚洲精品福利| 国产又黄又爽又色| 亚洲精品99久久久久中文字幕| 户外极限露出调教在线视频| 午夜精品一区二区三区在线| 精品视频成人| av一区观看| 亚洲mv大片欧洲mv大片| 日本中文字幕二区| av在线不卡免费看| av电影网站在线观看| 疯狂做受xxxx高潮欧美日本 | 国产在线你懂得| 欧美在线免费看| 日韩免费小视频| 欧美福利精品| 国产国产精品| 男女无套免费视频网站动漫| 久久久www免费人成精品| 日本免费在线观看视频| 亚洲美女视频网| 亚洲成人不卡| 亚洲国产一区二区在线| 欧美91视频| 男插女视频网站| 久久综合九色综合欧美98| 黄色录像免费观看| 9191精品国产综合久久久久久| 同心难改在线观看| 78色国产精品| 国产欧美日韩精品一区二区免费| 青青草国产免费| 91首页免费视频| 日本精品入口免费视频| 色偷偷噜噜噜亚洲男人| 中文字幕高清在线播放| 日本一区二区三区www| 欧美精品激情| 无码国产精品一区二区免费式直播 | 国产精品久久久久久久av电影| 国产极品模特精品一二| 亚洲精品影院| 国产视频欧美| 国产欧美一区二区三区在线观看视频| 五月激情综合婷婷| 国产www.大片在线| 久久久亚洲国产天美传媒修理工| 婷婷久久综合九色综合99蜜桃| 欧美日韩一区二区三| 亚洲美女网站| 免费一级黄色录像| 日韩一级片在线观看| 永久免费毛片在线播放| 亚洲国产一区二区在线 | 精品国偷自产一区二区三区| 韩国av一区二区| 日韩欧美不卡视频| 中文字幕精品国产| 成人搞黄视频| 亚洲 欧美 日韩系列| 国产日韩精品一区二区三区| 国产精品丝袜黑色高跟鞋| 亚洲欧美日韩精品久久| 久久久加勒比| 亚洲国产午夜伦理片大全在线观看网站 | 成人高h视频在线| 亚洲日本视频|