久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Java Shutdown Hook場景使用及源碼分析

瀏覽:6日期:2022-08-10 15:04:23
目錄背景Shutdown Hook 介紹關閉鉤子被調(diào)用場景注意事項實踐Shutdown Hook 在 Spring 中的運用背景

如果想在 Java 進程退出時,包括正常和異常退出,做一些額外處理工作,例如資源清理,對象銷毀,內(nèi)存數(shù)據(jù)持久化到磁盤,等待線程池處理完所有任務等等。特別是進程異常掛掉的情況,如果一些重要狀態(tài)沒及時保留下來,或線程池的任務沒被處理完,有可能會造成嚴重問題。那該怎么辦呢?

Java 中的 Shutdown Hook 提供了比較好的方案。我們可以通過 Java.Runtime.addShutdownHook(Thread hook) 方法向 JVM 注冊關閉鉤子,在 JVM 退出之前會自動調(diào)用執(zhí)行鉤子方法,做一些結尾操作,從而讓進程平滑優(yōu)雅的退出,保證了業(yè)務的完整性。

Shutdown Hook 介紹

其實,shutdown hook 就是一個簡單的已初始化但是未啟動的線程。當虛擬機開始關閉時,它將會調(diào)用所有已注冊的鉤子,這些鉤子執(zhí)行是并發(fā)的,執(zhí)行順序是不確定的。

在虛擬機關閉的過程中,還可以繼續(xù)注冊新的鉤子,或者撤銷已經(jīng)注冊過的鉤子。不過有可能會拋出 IllegalStateException。注冊和注銷鉤子的方法定義如下:

public void addShutdownHook(Thread hook) { // 省略}public void removeShutdownHook(Thread hook) { // 省略}關閉鉤子被調(diào)用場景

關閉鉤子可以在以下幾種場景被調(diào)用:

程序正常退出 程序調(diào)用 System.exit() 退出 終端使用 Ctrl+C 中斷程序 程序拋出異常導致程序退出,例如 OOM,數(shù)組越界等異常 系統(tǒng)事件,例如用戶注銷或關閉系統(tǒng) 使用 Kill pid 命令殺掉進程,注意使用 kill -9 pid 強制殺掉不會觸發(fā)執(zhí)行鉤子

驗證程序正常退出情況

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法...'))); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');Thread.sleep(2000);System.out.println('程序即將退出...'); }}

運行結果

程序開始啟動...程序即將退出...執(zhí)行鉤子方法...

Process finished with exit code 0

驗證程序調(diào)用 System.exit() 退出情況

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法...'))); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');Thread.sleep(2000);System.exit(-1);System.out.println('程序即將退出...'); }}

運行結果

程序開始啟動...執(zhí)行鉤子方法...

Process finished with exit code -1

驗證終端使用 Ctrl+C 中斷程序,在命令行窗口中運行程序,然后使用 Ctrl+C 中斷

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法...'))); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');Thread.sleep(2000);System.out.println('程序即將退出...'); }}

運行結果

D:IdeaProjectsjava-demojava ShutdownHookDemo程序開始啟動...執(zhí)行鉤子方法...

演示拋出異常導致程序異常退出

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法...'))); } public static void main(String[] args) {System.out.println('程序開始啟動...');int a = 0;System.out.println(10 / a);System.out.println('程序即將退出...'); }}

運行結果

程序開始啟動...執(zhí)行鉤子方法...Exception in thread 'main' java.lang.ArithmeticException: / by zero at com.chenpi.ShutdownHookDemo.main(ShutdownHookDemo.java:12)

Process finished with exit code 1

至于系統(tǒng)被關閉,或者使用 Kill pid 命令殺掉進程就不演示了,感興趣的可以自行驗證。

注意事項

可以向虛擬機注冊多個關閉鉤子,但是注意這些鉤子執(zhí)行是并發(fā)的,執(zhí)行順序是不確定的。

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法A...')));Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法B...')));Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法C...'))); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');Thread.sleep(2000);System.out.println('程序即將退出...'); }}

運行結果

程序開始啟動...程序即將退出...執(zhí)行鉤子方法B...執(zhí)行鉤子方法C...執(zhí)行鉤子方法A...

向虛擬機注冊的鉤子方法需要盡快執(zhí)行結束,盡量不要執(zhí)行長時間的操作,例如 I/O 等可能被阻塞的操作,死鎖等,這樣就會導致程序短時間不能被關閉,甚至一直關閉不了。我們也可以引入超時機制強制退出鉤子,讓程序正常結束。

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> { // 模擬長時間的操作 try {Thread.sleep(1000000); } catch (InterruptedException e) {e.printStackTrace(); }})); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');Thread.sleep(2000);System.out.println('程序即將退出...'); }}

以上的鉤子執(zhí)行時間比較長,最終會導致程序在等待很長時間之后才能被關閉。

如果 JVM 已經(jīng)調(diào)用執(zhí)行關閉鉤子的過程中,不允許注冊新的鉤子和注銷已經(jīng)注冊的鉤子,否則會報 IllegalStateException 異常。通過源碼分析,JVM 調(diào)用鉤子的時候,即調(diào)用 ApplicationShutdownHooks#runHooks() 方法,會將所有鉤子從變量 hooks 取出,然后將此變量置為 null。

// 調(diào)用執(zhí)行鉤子static void runHooks() { Collection<Thread> threads; synchronized(ApplicationShutdownHooks.class) {threads = hooks.keySet();hooks = null; } for (Thread hook : threads) {hook.start(); } for (Thread hook : threads) {try { hook.join();} catch (InterruptedException x) { } }}

在注冊和注銷鉤子的方法中,首先會判斷 hooks 變量是否為 null,如果為 null 則拋出異常。

// 注冊鉤子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);}// 注銷鉤子static synchronized boolean remove(Thread hook) { if(hooks == null)throw new IllegalStateException('Shutdown in progress'); if (hook == null)throw new NullPointerException(); return hooks.remove(hook) != null;}

我們演示下這種情況

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.println('執(zhí)行鉤子方法...'); Runtime.getRuntime().addShutdownHook(new Thread( () -> System.out.println('在JVM調(diào)用鉤子的過程中再新注冊鉤子,會報錯IllegalStateException'))); // 在JVM調(diào)用鉤子的過程中注銷鉤子,會報錯IllegalStateException Runtime.getRuntime().removeShutdownHook(Thread.currentThread());})); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');Thread.sleep(2000);System.out.println('程序即將退出...'); }}

運行結果

程序開始啟動...程序即將退出...執(zhí)行鉤子方法...Exception in thread 'Thread-0' java.lang.IllegalStateException: Shutdown in progress at java.lang.ApplicationShutdownHooks.add(ApplicationShutdownHooks.java:66) at java.lang.Runtime.addShutdownHook(Runtime.java:211) at com.chenpi.ShutdownHookDemo.lambda$static$1(ShutdownHookDemo.java:8) at java.lang.Thread.run(Thread.java:748)

如果調(diào)用 Runtime.getRuntime().halt() 方法停止 JVM,那么虛擬機是不會調(diào)用鉤子的。

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println('執(zhí)行鉤子方法...'))); } public static void main(String[] args) {System.out.println('程序開始啟動...');System.out.println('程序即將退出...');Runtime.getRuntime().halt(0); }}

運行結果

程序開始啟動...程序即將退出...

Process finished with exit code 0

如果要想終止執(zhí)行中的鉤子方法,只能通過調(diào)用 Runtime.getRuntime().halt() 方法,強制讓程序退出。在Linux環(huán)境中使用 kill -9 pid 命令也是可以強制終止退出。

package com.chenpi;public class ShutdownHookDemo { static {Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.println('開始執(zhí)行鉤子方法...'); Runtime.getRuntime().halt(-1); System.out.println('結束執(zhí)行鉤子方法...');})); } public static void main(String[] args) {System.out.println('程序開始啟動...');System.out.println('程序即將退出...'); }}

運行結果

程序開始啟動...程序即將退出...開始執(zhí)行鉤子方法...

Process finished with exit code -1

如果程序使用 Java Security Managers,使用 shutdown Hook 則需要安全權限 RuntimePermission(“shutdownHooks”),否則會導致 SecurityException。

實踐

例如,我們程序自定義了一個線程池,用來接收和處理任務。如果程序突然奔潰異常退出,這時線程池的所有任務有可能還未處理完成,如果不處理完程序就直接退出,可能會導致數(shù)據(jù)丟失,業(yè)務異常等重要問題。這時鉤子就派上用場了。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ShutdownHookDemo { // 線程池 private static ExecutorService executorService = Executors.newFixedThreadPool(3); static {Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.println('開始執(zhí)行鉤子方法...'); // 關閉線程池 executorService.shutdown(); try { // 等待60秒System.out.println(executorService.awaitTermination(60, TimeUnit.SECONDS)); } catch (InterruptedException e) {e.printStackTrace(); } System.out.println('結束執(zhí)行鉤子方法...');})); } public static void main(String[] args) throws InterruptedException {System.out.println('程序開始啟動...');// 向線程池添加10個任務for (int i = 0; i < 10; i++) { Thread.sleep(1000); final int finalI = i; executorService.execute(() -> {try { Thread.sleep(4000);} catch (InterruptedException e) { e.printStackTrace();}System.out.println('Task ' + finalI + ' execute...'); }); System.out.println('Task ' + finalI + ' is in thread pool...');} }}

在命令行窗口中運行程序,在10個任務都提交到線程池之后,任務都還未處理完成之前,使用 Ctrl+C 中斷程序,最終在虛擬機關閉之前,調(diào)用了關閉鉤子,關閉線程池,并且等待60秒讓所有任務執(zhí)行完成。

Java Shutdown Hook場景使用及源碼分析

Shutdown Hook 在 Spring 中的運用

Shutdown Hook 在 Spring 中是如何運用的呢。通過源碼分析,Springboot 項目啟動時會判斷 registerShutdownHook 的值是否為 true,默認是 true,如果為真則向虛擬機注冊關閉鉤子。

private void refreshContext(ConfigurableApplicationContext context) { refresh(context); if (this.registerShutdownHook) { try { context.registerShutdownHook(); } catch (AccessControlException ex) { // Not allowed in some environments. } }}@Overridepublic void registerShutdownHook() { if (this.shutdownHook == null) { // No shutdown hook registered yet. this.shutdownHook = new Thread() { @Override public void run() { synchronized (startupShutdownMonitor) {// 鉤子方法 doClose(); } } }; // 底層還是使用此方法注冊鉤子 Runtime.getRuntime().addShutdownHook(this.shutdownHook); }}

在關閉鉤子的方法 doClose 中,會做一些虛擬機關閉前處理工作,例如銷毀容器里所有單例 Bean,關閉 BeanFactory,發(fā)布關閉事件等等。

protected void doClose() { // Check whether an actual close attempt is necessary... if (this.active.get() && this.closed.compareAndSet(false, true)) { if (logger.isDebugEnabled()) { logger.debug('Closing ' + this); } LiveBeansView.unregisterApplicationContext(this); try { // 發(fā)布Spring 應用上下文的關閉事件,讓監(jiān)聽器在應用關閉之前做出響應處理 publishEvent(new ContextClosedEvent(this)); } catch (Throwable ex) { logger.warn('Exception thrown from ApplicationListener handling ContextClosedEvent', ex); } // Stop all Lifecycle beans, to avoid delays during individual destruction. if (this.lifecycleProcessor != null) { try { // 執(zhí)行l(wèi)ifecycleProcessor的關閉方法 this.lifecycleProcessor.onClose(); } catch (Throwable ex) { logger.warn('Exception thrown from LifecycleProcessor on context close', ex); } } // 銷毀容器里所有單例Bean destroyBeans(); // 關閉BeanFactory closeBeanFactory(); // Let subclasses do some final clean-up if they wish... onClose(); // Reset local application listeners to pre-refresh state. if (this.earlyApplicationListeners != null) { this.applicationListeners.clear(); this.applicationListeners.addAll(this.earlyApplicationListeners); } // Switch to inactive. this.active.set(false); }}

我們知道,我們可以定義 bean 并且實現(xiàn) DisposableBean 接口,重寫 destroy 對象銷毀方法。destroy 方法就是在 Spring 注冊的關閉鉤子里被調(diào)用的。例如我們使用 Spring 框架的 ThreadPoolTaskExecutor 線程池類,它就實現(xiàn)了 DisposableBean 接口,重寫了 destroy 方法,從而在程序退出前,進行線程池銷毀工作。源碼如下:

@Overridepublic void destroy() { shutdown();}/** * Perform a shutdown on the underlying ExecutorService. * @see java.util.concurrent.ExecutorService#shutdown() * @see java.util.concurrent.ExecutorService#shutdownNow() */public void shutdown() { if (logger.isInfoEnabled()) { logger.info('Shutting down ExecutorService' + (this.beanName != null ? ' ’' + this.beanName + '’' : '')); } if (this.executor != null) { if (this.waitForTasksToCompleteOnShutdown) { this.executor.shutdown(); } else { for (Runnable remainingTask : this.executor.shutdownNow()) { cancelRemainingTask(remainingTask); } } awaitTerminationIfNecessary(this.executor); }}

到此這篇關于Java Shutdown Hook場景使用及源碼分析的文章就介紹到這了,更多相關Java Shutdown Hook內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關文章:
主站蜘蛛池模板: 一区二区精品视频 | 欧美一级成人欧美性视频播放 | 日本免费一区二区在线观看 | 中文字幕在线视频网站 | 亚洲午夜一区 | 国产一区二区在线看 | 人人草人人 | 欧美日韩激情在线 | 精品欧美激情在线观看 | 一本色道精品久久一区二区三区 | 99久久99热这里只有精品 | 国产 欧美 日韩 一区 | 亚洲成人av一区二区 | 午夜精品一区二区三区在线播放 | 欧美久草 | 一区二区在线看 | 欧美hdfree性xxxx| 成人av在线网 | 欧美成人a | 国产精品25p | 狠狠av | 亚洲视频综合 | av在线播放国产 | 亚洲精品99 | 成人激情视频 | 日韩视频在线一区二区 | 国产成人高清精品免费5388 | 亚洲第一区在线 | 午夜精品久久久久久久久久久久 | 欧美另类专区 | 黄色毛片视频网站 | 日本aaaa| 国产美女久久久 | 精品国产一区二区三区成人影院 | 国产大片久久久 | 北条麻妃99精品青青久久 | 免费三片在线观看网站 | 天天操综合网 | 国产三级黄色毛片 | 成人毛片视频免费 | 经典法国性xxxx精品 | 一区二区三区欧美在线 | 视频一区二区三区在线观看 | 日本福利网站 | 日本成人午夜影院 | 我看午夜视频 | 国产精品久久久久久久久晋中 | 亚洲xx视频 | 成人精品久久久 | 免费v片| 一区二区在线看 | 久久99精品国产自在现线 | 精品久久久久久久久久久久久久久久久久久 | 日韩成人精品在线观看 | 国产成人啪精品午夜在线观看 | 国产视频999 | 亚洲自拍偷拍欧美 | 伊人爽| 成人精品三级av在线看 | 国产精品一区二区三区四区 | 狠狠撸在线| 国产精品视频网 | 亚洲精品久久久久久久久久久 | 成人av在线网 | 日韩综合在线 | 国产一区二区三区久久久久久久久 | 亚洲欧美视频 | 精品国产乱码久久久久久1区二区 | 国产在线h | 欧美一级毛片免费看 | 欧美精品被 | 国产中文视频 | 国产精品精品视频一区二区三区 | 美女久久 | 亚洲一区二区 | 日韩一区欧美 | 久免费视频| 国产婷婷色一区二区三区 | 婷婷91| 亚洲综合精品视频 | 国产一级毛片电影 | 亚洲aaa| 嫩草影院懂你的 | 久久久久久亚洲精品 | 91精品久久久久久久久久久 | 成人欧美在线视频 | 伊人久久一区二区三区 | 国产精品免费一区二区三区四区 | 中文字幕在线免费播放 | 成年无码av片在线 | www.日韩在线视频 | 91久久夜色精品国产网站 | 在线国产视频 | 99国产精品久久久久久久成人热 | 福利片在线观看 | 亚洲一二视频 | 波多野结衣一区二区三区高清 | 欧美一级电影 | 在线观看视频一区二区三区 | 日韩欧美一区二区视频 | 欧美一级电影免费观看 | 大象视频成人在线观看 | 蜜臀久久99精品久久久无需会员 | 亚洲国产91 | 凹凸日日摸日日碰夜夜爽孕妇 | 日日射天天干 | 黄色一级免费大片 | 久久久综合视频 | 欧美日韩视频在线播放 | 日韩城人网站 | 精品久久一区二区三区 | 手机看片169 | av在线成人 | 欧美黄色一级毛片 | 国产一区免费 | 综合五月激情 | 国产精品一区二区三区四区 | 激情99| 在线观看亚洲精品视频 | 人人操日日干 | 国内精品久久久久久影视8 91一区二区在线观看 | 久久久精品免费视频 | 久久国内精品 | 999精品免费 | 欧美视频在线免费 | 亚洲综合99 | 国产一区在线不卡 | 成人资源在线观看 | 欧美国产日韩一区 | 羞羞视频在线网站观看 | 国产专区一区 | 三区在线观看 | 亚洲国产1区 | 日日爱视频| 青草视频网站 | 欧美日韩一区精品 | 国产精品久久久久久久午夜 | 国产美女久久久 | 黄色影片网址 | 亚洲日韩欧美一区二区在线 | 一区二区中文 | 亚洲美女一区 | 日本妇人成熟免费视频 | 日韩欧美国产精品综合嫩v 国产高清av在线一区二区三区 | 亚洲中国精品精华液 | 日韩影院在线 | 亚洲国产精品久久久久久 | 精品久久久久久 | 欧美精品99| 日韩专区一区二区三区 | 最新日韩在线观看视频 | 欧美视频在线一区 | 天堂一区二区三区在线 | 福利二区视频 | 七七婷婷婷婷精品国产 | 久久久久亚洲美女啪啪 | 国产精品视频久久久 | 久久精品亚洲 | 国产精品视频一区二区免费不卡 | www.国产一区 | 亚洲人成人一区二区在线观看 | 欧美精品成人一区二区三区四区 | 亚洲一区二区中文字幕在线观看 | 亚洲一区二区三区在线 | 欧美日韩精品电影 | 91精品一区二区 | 日韩拍拍 | 久久九精品| 日韩91| 国产精品久久久久久久久免费桃花 | 亚洲综合色视频在线观看 | 成人av网址在线观看 | 仙踪林久久久久久久999 | 视频二区 | 日本阿v视频高清在线中文 中文二区 | 免费中文字幕 | 午夜男人天堂 | 桃色五月 | 日韩精品视频在线 | 日本一区二区不卡 | 波多野结衣一区二区三区中文字幕 | 一区二区在线视频 | 久久久国产精品 | av午夜电影| www.毛片 | 精品综合 | 国产一区二区三区四区在线观看 | 亚洲免费观看视频 | 国产午夜精品久久久久久久 | 夜夜艹 | 久久久亚洲一区二区三区 | 国产免费一区二区三区最新不卡 | 麻豆一区二区三区 | 一级毛片免费在线 | 香蕉视频成人在线观看 | 亚洲精品成人 | 国产精品久久国产精品 | 欧美一区二区三区免费观看视频 | 日韩高清中文字幕 | 欧美亚洲一区 | 都市激情av | 一区二区免费在线观看 | 91丝袜| 999热在线 | 日本一区二区三区在线视频 | 成人网av | 国产精品久久久久久久久久99 | 亚洲+变态+欧美+另类+精品 | 伊人电影综合网 | 精品久久久久久久久久 | 日本在线一区二区 | 成人在线一区二区 | 蜜桃免费视频 | 美女久久| 国产成人福利在线 | 精品国产一区二区三区在线观看 | 国产精品99久久久久久久vr | 亚洲精品国精品久久99热 | 剑来高清在线观看 | 99国产精品久久久久久久 | 亚洲精品国偷拍自产在线观看 | 91文字幕巨乱亚洲香蕉 | 好姑娘影视在线观看高清 | 欧洲精品一区 | 天堂一区| 成人免费视频网站在线观看 | 在线国v免费看 | 欧美日韩国产一区二区三区 | 亚洲天堂一区二区 | 久草在线高清 | www.色在线 | 久草日本 | 国产目拍亚洲精品99久久精品 | 亚洲综合二区 | 91高清在线 | 免费黄色av | 国产精品久久久av | 天天草天天干 | 亚洲精品a区 | 三级视频网站 | 国产欧美精品一区二区三区 | 国产高清视频在线 | 国产欧美综合一区二区三区 | 亚洲欧美一区二区三区在线 | 欧美日韩在线观看一区二区三区 | 亚洲精品片| 国产精品国产三级国产aⅴ无密码 | 色com| www天天干| www.夜夜骑 | 精品国产欧美一区二区 | 国产欧美综合一区二区三区 | 91精品久久久久久久久入口 | 精品久久99 | 欧美一a一片一级一片 | 亚洲视频精品在线 | 色偷偷噜噜噜亚洲男人 | 欧美一区不卡 | 欧美日韩一 | 欧美一区二区三区免费 | a视频在线免费观看 | 欧美天天 | 久久av综合网 | a久久免费视频 | 一本大道久久a久久精二百 国产精品片aa在线观看 | 毛片网站在线 | 国产高清在线观看 | 国产麻豆乱码精品一区二区三区 | av网站久久 | 黄色一级片在线看 | 国产乱码精品一区二区三区中文 | 亚洲精品福利视频 | 精品久久久中文字幕 | 视频二区| 国产精品久久久久久久午夜片 | 91在线观| 天天天综合网 | 国产欧美日韩在线 | 91伊人 | 天堂一区二区三区 | 中文亚洲字幕 | 91亚洲国产 | 日韩精品一区二区三区四区五区 | 中文字幕日韩一区 | 中文字幕国产视频 | 欧美精品一区二区三区免费视频 | 呦呦在线观看 | 日韩在线不卡一区 | 国产高清美女一级a毛片久久 | 免费黄色在线视频 | 国产精品视频 | 亚洲一区成人在线观看 | 黄色短视频在线观看 | 亚洲成人网在线 | 国产精品久久久久久久久免费桃花 | 99久久精品国产一区二区三区 | 欧美日本一区 | 国产精品一区在线观看 | 日日骚视频| 亚洲不卡视频 | 成人看的羞羞视频免费观看 | 久久久精品欧美一区二区免费 | 中文字幕在线播放不卡 | 日韩av一区二区三区四区 | 国产成人精品网站 | 午夜久久网站 | 欧美一级在线观看 | 精品久久影院 | 久久美女 | 综合亚洲精品 | 精品国产高清一区二区三区 | 亚洲 中文 欧美 日韩在线观看 | 国产精品一区二区三区在线看 | 一区二区三区精品视频免费看 | 久久精品国产亚洲一区二区三区 | 91尤物网站网红尤物福利 | 午夜影院在线观看 | 国产精品久久久久久久久久久久久久 | 色接久久| 亚洲不卡视频在线 | 中文字幕视频在线 | 日韩美香港a一级毛片免费 国产综合av | 日韩在线高清视频 | 午夜精品久久久久久久久久久久久 | 嫩草研究院在线观看入口 | 久久久久久久国产精品 | 日韩在线观看一区二区 | 国产精品乱码一二三区的特点 | 韩国久久精品 | 欧美日韩精品网站 | 91色在线观看| 欧美精品欧美激情 | 99re99| 精品九九 | 四虎5151久久欧美毛片 | 中文字幕不卡在线88 | 美女黄视频网站 | 国产精品久久久久久久久久小说 | 成人一级片视频 | 另类久久 | 精品欧美一区二区三区久久久 | 特黄毛片 | 国产日韩欧美视频 | 蜜桃av一区二区三区 | 91精品一区二区三区久久久久久 | 午夜天堂精品久久久久 | 黄色a视频| 日韩毛片在线观看 | 成人午夜 | 青青久久av北条麻妃海外网 | 黄色精品 | 天堂亚洲 | 可以免费观看的av | 日韩看片 | 精品一区二区三区在线视频 | 伦理自拍 | 三级黄色在线视频 | 成人在线精品 | 中文字幕在线观看av | 久久精品国产一区 | 一级毛片网 | 日韩精品小视频 | 国产片av| 五月天婷婷社区 | 成人免费影院 | 精品96久久久久久中文字幕无 | 狠狠操操| 午夜久久| 亚洲精品一区中文字幕乱码 | 国产一级二级毛片 | 欧美精品一区在线发布 | 国产日韩精品视频 | 91精品国产综合久久久久久丝袜 | 亚洲大片69999 | 中文二区 | 99精品一区二区 | 日韩手机在线观看 | 欧美日韩不卡合集视频 | 精品一区二区6 | 欧美日韩亚洲成人 | 色欧美日韩 | 欧美视频一二 | 夜添久久精品亚洲国产精品 | 在线观看免费视频91 | 欧美一区二区在线看 | 欧美日韩在线免费 | 天天操天天插 | 精品国产不卡一区二区三区 | 91精品国产综合久久婷婷香蕉 | 日韩在线观看中文字幕 | 久久一精品 | 欧美一级片毛片免费观看视频 | 国产一区不卡视频 | 欧美一级小视频 | 国产精品毛片久久久久久 | 免费成人av在线 | 欧美性影院| 国产一区二区三区免费观看 | 国产精品91视频 | 在线观看精品91福利 | 成人免费网站在线观看 | 中文在线a在线 | 久久不射电影网 | 欧美黄色a视频 | 91国内精品久久 | 久久激情五月丁香伊人 | 国产成人免费视频 | 成人网在线 | 国产免费一区二区三区 | 国产日韩一区二区 | 毛片真人毛毛片毛片 | 欧美一区二区三区视频 | 欧美一区二区三区国产精品 | 91免费在线视频 | 欧美乱轮| 欧美二区视频 | 日韩城人网站 | www.久久精品| 91精品久久久久久久 | 日本不卡在线 | 欧美男人天堂网 | 在线久草 | 五月天婷婷综合 | 在线观看一级片 | 久久com| 在线毛片观看 | 亚洲视频一区在线 | 91视频在线 | 午夜不卡福利视频 | 青青草99 | 一区二区亚洲 | 狠狠爱网站 | 一区二区成人 | 亚洲免费视频网 | 精品伦精品一区二区三区视频 | 欧美一区二区三区视频 | 精品国产乱码简爱久久久久久 | 美女扒开内裤让男人桶 | 天天干天操 | 免费国产一区 | 天天舔天天爽 | 国产视频一区二区在线 | 国产成人一区 | 成年入口无限观看网站 | 97视频久久久 | 新99热 | 久久视频精品 | 久久精品一区二区三区四区 | 久久中文字幕一区二区三区 | 97在线观看视频 | 欧美一区二区三 | 国产精品电影 | 九九国产| 亚洲a网 | www亚洲一区| 亚洲一区二区在线免费观看 | av天天操| 日韩一区二区不卡 | 亚洲精品乱码 | 精品久久久久久久久久久久 | 欧美成人福利 | 夜夜天天| 538在线精品 | 黄色片在线观看视频 | 在线成人av| www久久久久久久 | 亚洲最大av网站 | 青娱乐99 | 91伊人网| 成人免费黄色小视频 | 五月激情婷婷六月 | 天天草天天干 | 久热99| www.99精品 | 亚洲国产精品一区二区三区 | 欧美二区三区 | 成人美女免费网站视频 | 国产精品久久久久久久久久免费看 | 美女视频久久 | 国产精品美女久久久久久久久久久 | 欧美三级电影在线观看 | 国产精品高潮呻吟久久av黑人 | 天天色天天色 | 亚洲美女网站 | 91精品国产福利在线观看 | 久久亚洲一区二区三 | 中国女人黄色大片 | 日本激情网 | 福利片在线 | 国产精品福利在线 | 成人在线一区二区 | 在线观看国产视频 | a性片| 成人欧美一区二区三区白人 | 国产精品99久久久久久大便 | 久热在线视频 | 久久精品国产免费 | 欧美a网站 | 欧美视频在线免费 | 黄色精品一区二区 | 欧美成人一区二区 | 亚洲国产精品久久人人爱 | 91精品国产综合久久福利软件 | 91久久精品日日躁夜夜躁国产 | 亚洲精品视频在线免费播放 | 99热在线国产 | 国产精品一区二区三区四区 | 一级特黄aaa大片在线观看 | 免费的一级毛片 | 成人片免费看 | 在线播放亚洲 | 国产情侣在线视频 | 裸体的日本在线观看 | 亚洲一区二区三区四区在线 | 91国内视频在线观看 | 久久男人天堂 | 久99视频 | 日韩一区中文字幕 | 国产欧美日韩中文字幕 | 毛片网站在线 | 日韩av在线中文字幕 | 免费av片| 日本免费三片免费观看 | 在线一区二区三区 | 国产一二三四在线 | 亚洲成人免费 | 一区日韩| 亚洲三区电影 | 国产黄色影视 | 九色 在线 | 国产精品久久久久久久一区探花 | 亚洲国产区 | 日韩欧美一区二区视频 | 国产精品久久久久久久久久久久午夜片 | 国产日韩欧美一区 | 成人网电影| 日韩一区二区在线观看 | 久久精品国产精品青草 | 亚洲精品一区二区网址 | 日韩一区二 | 国产精品热 | 久草视频免费看 | 国产成年免费视频 | 欧美视频网站 | 亚洲网站免费观看 | 欧美区国产区 | 久久久国产精品入口麻豆 | av大片在线观看 | 黄久久久 | 羞羞视频在线观看入口 | 在线精品国产 | 亚洲综合成人网 | 国产性色av | 午夜视频网 | 欧美一区二区三区久久精品 | 国产成人一区 | 国产一区二区三区免费视频 | 国产成人精品亚洲日本在线观看 | 天天干女人 | 午夜视频网 | 成年人福利 | 欧美一区二区视频 | 狠狠的日 | 午夜精品久久久久 | av动漫一区二区 | 黄色片免费观看网站 | 精品亚洲一区二区三区四区五区 | 国产主播福利 | 午夜影院在线观看视频 | 一级毛片观看 | 国产成人在线看 | 欧美精品www| 精品国产乱码久久久久久1区2区 | 欧美日韩在线精品 | 久久亚洲一区二区三区四区 | 男女视频免费在线观看 | 日韩av网站在线 | www.av在线 | 国产一区二区视频在线观看 | 久久综合一区二区 | 欧美一级片在线观看 | 亚洲精品日韩激情在线电影 | 国产乱码精品一区二区三区忘忧草 | 亚洲毛片在线观看 | 韩国精品 | 欧美一级片在线观看 | 国产精品高清在线 | 成人精品 | 日韩欧美精品一区二区三区 | 欧美一区视频 | 国产精品久久久久aaaa | 久久久99日产| 人人澡人人射 | 国产香蕉97碰碰久久人人九色 | 亚洲精品免费视频 | 色综合色综合网色综合 | 韩国毛片在线 | 亚洲一区视频在线播放 | 在线视频 亚洲 | 草草网站 | 日韩在线免费电影 | 亚洲小视频 | 久草在线观看福利视频 | 欧美大片在线看免费观看 | 久久精品国产一区 | 日本阿v视频高清在线中文 中文二区 | 午夜激情免费看 | 免费一区二区三区视频在线 | 亚洲www啪成人一区二区 | 久草网在线视频 | 永久精品 | 久久精品国产99国产 | 操操操av| 亚洲九九 | 欧美日一区二区 |