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

ThreadLocal內存溢出代碼演示和原因分析!

開發 前端
本文我們使用代碼的方式演示了 ThreadLocal 內存溢出的問題,嚴格來講內存溢出并不是 ThreadLocal 的問題,而是因為沒有正確使用 ThreadLocal 所帶來的問題。

[[401564]]

前言

ThreadLocal 翻譯成中文是線程本地變量的意思,也就是說它是線程中的私有變量,每個線程只能操作自己的私有變量,所以不會造成線程不安全的問題。

所謂的線程不安全是指,多個線程在同一時刻對同一個全局變量做寫操作時(讀操作不會涉及線程不安全問題),如果執行的結果和我們預期的結果不一致就稱之為線程不安全,反之,則稱為線程安全。

在 Java 語言中解決線程不安全的問題通常有兩種手段:

  • 使用鎖(使用 synchronized 或 Lock);
  • 使用 ThreadLocal。

鎖的實現方案是在多線程寫入全局變量時,通過排隊一個一個來寫入全局變量,從而就可以避免線程不安全的問題了。比如當我們使用線程不安全的 SimpleDateFormat 對時間進行格式化時,如果使用鎖來解決線程不安全的問題,實現的流程就是這樣的:

從上述圖片可以看出,通過加鎖的方式雖然可以解決線程不安全的問題,但同時帶來了新的問題,使用鎖時線程需要排隊執行,因此會帶來一定的性能開銷。然而,如果使用的是 ThreadLocal 的方式,則是給每個線程創建一個 SimpleDateFormat 對象,這樣就可以避免排隊執行的問題了,它的實現流程如下圖所示:

  • PS:創建 SimpleDateFormat 也會消耗一定的時間和空間,如果線程復用 SimpleDateFormat 的頻率比較高的情況下,使用 ThreadLocal 的優勢比較大,反之則可以考慮使用鎖。

然而,在我們使用 ThreadLocal 的過程中,很容易就會出現內存溢出的問題,如下面的這個事例。

什么是內存溢出?

內存溢出(Out Of Memory,簡稱 OOM)是指無用對象(不再使用的對象)持續占有內存,或無用對象的內存得不到及時釋放,從而造成的內存空間浪費的行為就稱之為內存泄露。

內存溢出代碼演示

在開始演示 ThreadLocal 內存溢出的問題之前,我們先使用“-Xmx50m”的參數來設置一下 Idea,它表示將程序運行的最大內存設置為 50m,如果程序的運行超過這個值就會出現內存溢出的問題,設置方法如下:

設置后的最終效果這樣的:

  • PS:因為我使用的 Idea 是社區版,所以可能和你的界面不一樣,你只需要點擊“Edit Configurations...”找到“VM options”選項,設置上“-Xmx50m”參數就可以了。

配置完 Idea 之后,接下來我們來實現一下業務代碼。在代碼中我們會創建一個大對象,這個對象中會有一個 10m 大的數組,然后我們將這個大對象存儲在 ThreadLocal 中,再使用線程池執行大于 5 次添加任務,因為設置了最大運行內存是 50m,所以理想的情況是執行 5 次添加操作之后,就會出現內存溢出的問題,實現代碼如下:

  1. import java.util.concurrent.LinkedBlockingQueue; 
  2. import java.util.concurrent.ThreadPoolExecutor; 
  3. import java.util.concurrent.TimeUnit; 
  4.  
  5. public class ThreadLocalOOMExample { 
  6.      
  7.     /** 
  8.      * 定義一個 10m 大的類 
  9.      */ 
  10.     static class MyTask { 
  11.         // 創建一個 10m 的數組(單位轉換是 1M -> 1024KB -> 1024*1024B) 
  12.         private byte[] bytes = new byte[10 * 1024 * 1024]; 
  13.     } 
  14.      
  15.     // 定義 ThreadLocal 
  16.     private static ThreadLocal<MyTask> taskThreadLocal = new ThreadLocal<>(); 
  17.  
  18.     // 主測試代碼 
  19.     public static void main(String[] args) throws InterruptedException { 
  20.         // 創建線程池 
  21.         ThreadPoolExecutor threadPoolExecutor = 
  22.                 new ThreadPoolExecutor(5, 5, 60, 
  23.                         TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)); 
  24.         // 執行 10 次調用 
  25.         for (int i = 0; i < 10; i++) { 
  26.             // 執行任務 
  27.             executeTask(threadPoolExecutor); 
  28.             Thread.sleep(1000); 
  29.         } 
  30.     } 
  31.  
  32.     /** 
  33.      * 線程池執行任務 
  34.      * @param threadPoolExecutor 線程池 
  35.      */ 
  36.     private static void executeTask(ThreadPoolExecutor threadPoolExecutor) { 
  37.         // 執行任務 
  38.         threadPoolExecutor.execute(new Runnable() { 
  39.             @Override 
  40.             public void run() { 
  41.                 System.out.println("創建對象"); 
  42.                 // 創建對象(10M) 
  43.                 MyTask myTask = new MyTask(); 
  44.                 // 存儲 ThreadLocal 
  45.                 taskThreadLocal.set(myTask); 
  46.                 // 將對象設置為 null,表示此對象不在使用了 
  47.                 myTask = null
  48.             } 
  49.         }); 
  50.     } 

以上程序的執行結果如下:

從上述圖片可看出,當程序執行到第 5 次添加對象時就出現內存溢出的問題了,這是因為設置了最大的運行內存是 50m,每次循環會占用 10m 的內存,加上程序啟動會占用一定的內存,因此在執行到第 5 次添加任務時,就會出現內存溢出的問題。

原因分析

內存溢出的問題和解決方案比較簡單,重點在于“原因分析”,我們要通過內存溢出的問題搞清楚,為什么 ThreadLocal 會這樣?是什么原因導致了內存溢出?

要搞清楚這個問題(內存溢出的問題),我們需要從 ThreadLocal 源碼入手,所以我們首先打開 set 方法的源碼(在示例中使用到了 set 方法),如下所示:

  1. public void set(T value) { 
  2.     // 得到當前線程 
  3.     Thread t = Thread.currentThread(); 
  4.     // 根據線程獲取到 ThreadMap 變量 
  5.     ThreadLocalMap map = getMap(t); 
  6.     if (map != null
  7.         map.set(this, value); // 將內容存儲到 map 中 
  8.     else 
  9.         createMap(t, value); // 創建 map 并將值存儲到 map 中 

從上述代碼我們可以看出 Thread、ThreadLocalMap 和 set 方法之間的關系:每個線程 Thread 都擁有一個數據存儲容器 ThreadLocalMap,當執行 ThreadLocal.set 方法執行時,會將要存儲的值放到 ThreadLocalMap 容器中,所以接下來我們再看一下 ThreadLocalMap 的源碼:

  1. static class ThreadLocalMap { 
  2.     // 實際存儲數據的數組 
  3.     private Entry[] table
  4.     // 存數據的方法 
  5.     private void set(ThreadLocal<?> key, Object value) { 
  6.         Entry[] tab = table
  7.         int len = tab.length; 
  8.         int i = key.threadLocalHashCode & (len-1); 
  9.         for (Entry e = tab[i]; 
  10.                 e != null
  11.                 e = tab[i = nextIndex(i, len)]) { 
  12.             ThreadLocal<?> k = e.get(); 
  13.             // 如果有對應的 key 直接更新 value 值 
  14.             if (k == key) { 
  15.                 e.value = value; 
  16.                 return
  17.             } 
  18.             // 發現空位插入 value 
  19.             if (k == null) { 
  20.                 replaceStaleEntry(key, value, i); 
  21.                 return
  22.             } 
  23.         } 
  24.         // 新建一個 Entry 插入數組中 
  25.         tab[i] = new Entry(key, value); 
  26.         int sz = ++size
  27.         // 判斷是否需要進行擴容 
  28.         if (!cleanSomeSlots(i, sz) && sz >= threshold) 
  29.             rehash(); 
  30.     } 
  31.     // ... 忽略其他源碼 

從上述源碼我們可以看出:ThreadMap 中有一個 Entry[] 數組用來存儲所有的數據,而 Entry 是一個包含 key 和 value 的鍵值對,其中 key 為 ThreadLocal 本身,而 value 則是要存儲在 ThreadLocal 中的值。

根據上面的內容,我們可以得出 ThreadLocal 相關對象的關系圖,如下所示:

也就是說它們之間的引用關系是這樣的:Thread -> ThreadLocalMap -> Entry -> Key,Value,因此當我們使用線程池來存儲對象時,因為線程池有很長的生命周期,所以線程池會一直持有 value 值,那么垃圾回收器就無法回收 value,所以就會導致內存一直被占用,從而導致內存溢出問題的發生。

解決方案

ThreadLocal 內存溢出的解決方案很簡單,我們只需要在使用完 ThreadLocal 之后,執行 remove 方法就可以避免內存溢出問題的發生了,比如以下代碼:

  1. import java.util.concurrent.LinkedBlockingQueue; 
  2. import java.util.concurrent.ThreadPoolExecutor; 
  3. import java.util.concurrent.TimeUnit; 
  4.  
  5. public class App { 
  6.  
  7.     /** 
  8.      * 定義一個 10m 大的類 
  9.      */ 
  10.     static class MyTask { 
  11.         // 創建一個 10m 的數組(單位轉換是 1M -> 1024KB -> 1024*1024B) 
  12.         private byte[] bytes = new byte[10 * 1024 * 1024]; 
  13.     } 
  14.  
  15.     // 定義 ThreadLocal 
  16.     private static ThreadLocal<MyTask> taskThreadLocal = new ThreadLocal<>(); 
  17.  
  18.     // 測試代碼 
  19.     public static void main(String[] args) throws InterruptedException { 
  20.         // 創建線程池 
  21.         ThreadPoolExecutor threadPoolExecutor = 
  22.                 new ThreadPoolExecutor(5, 5, 60, 
  23.                         TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)); 
  24.         // 執行 n 次調用 
  25.         for (int i = 0; i < 10; i++) { 
  26.             // 執行任務 
  27.             executeTask(threadPoolExecutor); 
  28.             Thread.sleep(1000); 
  29.         } 
  30.     } 
  31.  
  32.     /** 
  33.      * 線程池執行任務 
  34.      * @param threadPoolExecutor 線程池 
  35.      */ 
  36.     private static void executeTask(ThreadPoolExecutor threadPoolExecutor) { 
  37.         // 執行任務 
  38.         threadPoolExecutor.execute(new Runnable() { 
  39.             @Override 
  40.             public void run() { 
  41.                 System.out.println("創建對象"); 
  42.                 try { 
  43.                     // 創建對象(10M) 
  44.                     MyTask myTask = new MyTask(); 
  45.                     // 存儲 ThreadLocal 
  46.                     taskThreadLocal.set(myTask); 
  47.                     // 其他業務代碼... 
  48.                 } finally { 
  49.                     // 釋放內存 
  50.                     taskThreadLocal.remove(); 
  51.                 } 
  52.             } 
  53.         }); 
  54.     } 

以上程序的執行結果如下:

從上述結果可以看出我們只需要在 finally 中執行 ThreadLocal 的 remove 方法之后就不會在出現內存溢出的問題了。

remove的秘密

那 remove 方法為什么會有這么大的魔力呢?我們打開 remove 的源碼看一下:

  1. public void remove() { 
  2.     ThreadLocalMap m = getMap(Thread.currentThread()); 
  3.     if (m != null
  4.         m.remove(this); 

從上述源碼中我們可以看出,當調用了 remove 方法之后,會直接將 Thread 中的 ThreadLocalMap 對象移除掉,這樣 Thread 就不再持有 ThreadLocalMap 對象了,所以即使 Thread 一直存活,也不會造成因為(ThreadLocalMap)內存占用而導致的內存溢出問題了。

總結

本文我們使用代碼的方式演示了 ThreadLocal 內存溢出的問題,嚴格來講內存溢出并不是 ThreadLocal 的問題,而是因為沒有正確使用 ThreadLocal 所帶來的問題。想要避免 ThreadLocal 內存溢出的問題,只需要在使用完 ThreadLocal 后調用 remove 方法即可。不過通過 ThreadLocal 內存溢出的問題,讓我們搞清楚了 ThreadLocal 的具體實現,方便我們日后更好的使用 ThreadLocal,以及更好的應對面試。

本文轉載自微信公眾號「Java中文社群」,可以通過以下二維碼關注。轉載本文請聯系Java中文社群公眾號。

 

責任編輯:姜華 來源: Java中文社群
相關推薦

2023-09-22 17:34:37

內存remove方法

2023-05-29 07:17:48

內存溢出場景

2013-08-02 10:06:36

Android內存溢出

2024-11-12 15:42:06

2018-10-25 15:24:10

ThreadLocal內存泄漏Java

2024-10-31 09:24:42

2021-06-28 06:45:06

內存溢出內存泄露JavaScript

2018-04-17 14:41:41

Java堆內存溢出

2021-04-23 20:59:02

ThreadLocal內存

2019-08-29 14:29:42

JVM內存 Java

2024-03-11 08:22:40

Java內存泄漏

2022-08-26 07:33:49

內存JVMEntry

2024-09-09 09:41:03

內存溢出golang開發者

2019-09-24 08:56:00

內存Redis使用

2015-03-30 11:18:50

內存管理Android

2023-10-07 08:26:40

多線程數據傳遞數據共享

2025-06-16 07:40:00

2012-05-15 02:04:22

JVMJava

2021-08-10 09:58:59

ThreadLocal內存泄漏

2022-04-29 10:02:53

內存溢出服務器
點贊
收藏

51CTO技術棧公眾號

欧美极品少妇无套实战| 亚洲人成自拍网站| 97中文在线观看| 亚洲а∨天堂久久精品2021| 成年人在线观看视频| 91影院成人| 日本韩国一区二区三区| 国产精品一 二 三| 久久免费看少妇高潮v片特黄 | youjizz在线视频| 亚洲国产欧美在线观看| 99精品在线观看视频| 亚洲一区999| 99蜜桃臀久久久欧美精品网站| 中国老头性行为xxxx| 91国产一区| av一区二区三区四区| 色综合色综合网色综合| 91日韩精品视频| 天天综合网天天综合| 国产一区观看| 欧美xxxx在线观看| 亚洲精品少妇一区二区| 天天干天天干天天操| 欧美aaa级| heyzo一本久久综合| 国产最新精品视频| 色婷婷一区二区三区av免费看| 亚洲乱码国产乱码精品精软件| 亚洲欧洲av| 色综合网色综合| 日本高清不卡三区| 999视频在线| 国产精品主播在线观看| 亚洲综合视频网| 高清不卡一区二区三区| 国产精品30p| 亚洲国产综合在线观看| 国产午夜久久久久| 91精品国产免费久久久久久| 国产欧美激情视频| 成人在线观看亚洲| 国产91在线|亚洲| 久久久久久久久国产| 欧美日韩一区二区三区四区五区六区| 福利成人导航| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美在线性视频| 久久午夜福利电影| 韩日成人影院| 国产精品国产a| 国产精品日韩在线一区| 亚洲伦理一区二区三区| 亚洲第一会所| 一区二区三区久久久| 91免费福利视频| 99精品全国免费观看| 我爱我色成人网| ww久久中文字幕| 2019av中文字幕| 91麻豆精品国产91久久综合| 日本综合久久| 伊人开心综合网| 欧美日韩一区二| 国产又大又黑又粗| 国产精品x453.com| 亚洲国产美女精品久久久久∴| 毛片一区二区三区四区| 欧美777四色影视在线| 香蕉久久夜色精品国产| 久久精品视频在线| 成人手机在线免费视频| 小草在线视频免费播放| 94色蜜桃网一区二区三区| 国产美女被下药99| 亚欧视频在线观看| 婷婷精品进入| 欧美大胆一级视频| 老子影院午夜伦不卡大全| 成人高清网站| 激情综合五月天| 久久99亚洲热视| 无码人妻丰满熟妇啪啪欧美| 成人h动漫精品一区二区器材| 欧美性一区二区| 中国一区二区三区| 国产成人精品免费看视频| 视频一区国产视频| 视频在线观看99| ass精品国模裸体欣赏pics| 久久uomeier| 亚洲第一福利视频在线| 欧美极品jizzhd欧美| 99热这里只有精品9| 欧美日韩亚洲一区| 最好看的2019年中文视频| 日韩av加勒比| 人成在线免费网站| 亚洲自拍偷拍麻豆| 欧美 日韩 国产 在线观看 | 国产97在线|亚洲| 国产福利精品在线| 欧美亚洲色综久久精品国产| 国产伦理久久久久久妇女| 欧美丝袜一区二区| 精品视频在线观看一区| 伊人福利在线| 很黄的网站在线观看| 香蕉久久夜色精品国产| 日本一区二区动态图| 91丨九色丨黑人外教| 国产精品久久久久久久久久久久久久 | 麻豆成人久久精品二区三区小说| 毛片精品免费在线观看| 大吊一区二区三区| 久草成人资源| 日韩欧美www| 一起草最新网址| 精品一区视频| 欧洲在线/亚洲| 日韩精品在线中文字幕| 8888四色奇米在线观看| 成人免费视频一区二区| 99三级在线| 全部免费毛片在线播放一个| 成人性生交大合| 成人免费黄色网| 一级一片免费看| 亚洲久久一区二区| 51色欧美片视频在线观看| 国产视频91在线| 久久久久久久久久久久久久| 亚洲欧美中文日韩在线v日本| av直播在线观看| 狠狠一区二区三区| 台湾佬综合网| 狠狠操狠狠色综合网| 自慰无码一区二区三区| 色偷偷偷在线视频播放| 一区二区在线观看视频| 欧美又粗又长又爽做受| 蜜桃av在线播放| 亚洲va天堂va国产va久| 久久无码高潮喷水| 四虎4545www国产精品| 欧美视频一区二区三区在线观看 | 亚洲国产另类久久精品 | 国产99久一区二区三区a片| 国产呦精品一区二区三区网站| 97久久人人超碰caoprom欧美| 成人福利小视频| 国产一区二区按摩在线观看| av日韩免费电影| 欧美拍拍视频| 91网站视频在线观看| 亚洲看片网站| 国产中文字幕在线播放| 91看片淫黄大片一级| 91视频免费网站| 亚洲自拍小视频| 美女福利视频网| 自拍偷拍欧美专区| 欧美亚洲日本网站| 亚洲字幕av一区二区三区四区| 国产精品66部| 日韩一区不卡| 久久不射影院| 欧美日韩在线免费视频| 亚洲一区二区中文字幕在线观看| 香蕉免费一区二区三区在线观看| 亚洲精品mp4| 久久成人小视频| 99久久亚洲精品蜜臀| 日韩视频免费在线观看| 国产成人亚洲精品自产在线 | 亚洲欧美色图小说| 免费日韩在线观看| 99riav视频一区二区| 欧美日韩精品一二三区| 国产av一区二区三区传媒| 青青草国产成人a∨下载安卓| 久久久久久久香蕉网| 国产高清中文字幕| 国产不卡视频在线观看| 亚洲成人第一| 亚洲美女炮图| 精品少妇一区二区三区日产乱码| 少妇视频在线播放| 欧美aa国产视频| 国产精品主播视频| 毛片网站在线| 欧美日韩精品二区| 天天色综合社区| 欧美日韩xxxx| 欧美亚州一区二区三区| 性欧美一区二区三区| 国产精品不卡一区| 爱情岛论坛成人| 免费精品国产的网站免费观看| 久久久久久久网站| 亚洲第一大网站| 亚洲免费资源在线播放| 国产精品免费入口| 国产精品99久久免费观看| 欧美另类在线观看| 国产成人精品一区二区无码呦| 亚洲欧洲日韩av| 中文字幕在线综合| 亚洲三级精品| 色综合天天狠天天透天天伊人| 国产女人18毛片水18精| 亚洲欧美在线aaa| 亚洲妇熟xx妇色黄蜜桃| 午夜先锋成人动漫在线| 久久久国产成人精品| 一区二区三区午夜| 国产精品乱码一区二区三区软件 | 可以直接看的黄色网址| 国内精品国产三级国产a久久| 视频一区二区在线| 99蜜月精品久久91| 亚洲国产精品yw在线观看 | 中文精品电影| 99免费在线观看视频| 欧美大胆的人体xxxx| 欧美日韩一区视频| 在线观看黄网址| 日韩国产欧美在线播放| 亚洲精品中文综合第一页| 亚洲综合视频| 欧美日韩国产123| 国产又黄又大又粗的视频| 中文字幕佐山爱一区二区免费| 成年人黄色片视频| 成人性生交大片免费看中文视频| 69av视频在线播放| 毛片在线能看| 欧美高清视频在线高清观看mv色露露十八| 欧美 日本 国产| 日韩av二区在线播放| 久久99蜜桃综合影院免费观看| 成人午夜视屏| 日韩国产精品视频| 精品视频一区二区在线观看| 国产乱理伦片在线观看夜一区| www.好吊操| 欧美男gay| 成人字幕网zmw| 欧美日本一道| 亚洲精品成人网| 一区二区三区视频免费看| 日本一区二区免费在线 | 电影91久久久| 4388成人网| 在线观看精品一区二区三区| 欧洲人成人精品| 欧美人妻一区二区| 国产福利一区二区三区视频在线| aa在线观看视频| 欧美www视频在线观看| 国产精品嫩草在线观看| 国产后进白嫩翘臀在线观看视频| 精品国产sm最大网站免费看| 日韩女优在线观看| 国产精品久久久一本精品| 一区二区xxx| 一本色道久久综合亚洲精品不| 中文一区一区三区免费| 一区二区三区| 久久99久久99精品中文字幕| 成年网站在线| 欧美三级在线视频| 91高清免费观看| 国产欧美精品在线观看| 久久人人爽av| 欧美成人综合| 精品一区二区三区免费毛片| 久久九九精品视频| 久久人人97超碰精品888| 日本一级在线观看| 欧美午夜电影一区| 国产探花在线播放| 国产精品视频一二三区| 麻豆国产精品一区| 国产成人午夜99999| 我要看一级黄色大片| 亚洲欧美成人综合| 91.com在线| 一区二区三区在线观看免费| 国内一区二区三区在线视频| 久久久国产精品入口麻豆| 国产精品视频26uuu| 神马午夜伦理不卡| 日韩网站免费观看| 国产小视频免费在线网址| 日韩电影在线观看永久视频免费网站| www.av日韩| 一本色道久久综合亚洲aⅴ蜜桃 | 泷泽萝拉在线播放| 久久电影网站中文字幕 | 日本五十路女优| 欧美激情中文不卡| 亚洲成人福利视频| 日韩经典中文字幕一区| 91精品91久久久中77777老牛| 狠久久av成人天堂| 污污污污污污www网站免费| 五月精品视频| 国产又粗又硬又长| 婷婷成人基地| 日本视频精品一区| 91成人午夜| 国产日韩二区| 欧美精品中文字幕亚洲专区| 精品日本一区二区三区在线观看| 成人av综合网| 91网在线免费观看| 免费成人美女女| 国产精品一区久久| 婷婷久久综合九色综合99蜜桃| 91精品国产色综合久久不卡98口| av电影高清在线观看| 中文字幕精品网| 91精品专区| 亚洲欧美激情四射在线日| 久久经典视频| 中文字幕精品在线| 精品福利视频导航大全| 中文字幕免费国产精品| 亚洲区小说区图片区| 精品免费国产二区三区| 亚洲 国产 欧美 日韩| 亚洲欧美日韩天堂一区二区| 爱久久·www| 久久亚洲精品小早川怜子66| 天堂av最新在线| 久久色精品视频| 岛国毛片av在线| 国产不卡av在线| 成人欧美大片| 成人午夜在线影院| 精品淫伦v久久水蜜桃| 国产精品国模大尺度私拍| 欧美a级大片在线| 九色91视频| 91一区在线| 久久久久久久中文| 麻豆久久久久久| av免费观看不卡| 日本一区二区成人| 激情综合五月网| 亚洲一区二区高清| 日本黄色一级视频| 色欧美88888久久久久久影院| 国产一区二区三区在线观看| 欧美tk丨vk视频| 内射无码专区久久亚洲| 在线观看免费高清视频97| p色视频免费在线观看| 中文字幕精品久久久久| av不卡高清| 成人做爽爽免费视频| 成人在线精品| 91视频99| 久久亚洲国产| 免费看又黄又无码的网站| 久久综合综合久久综合| 男女一区二区三区| 久久综合网色—综合色88| 成熟的女同志hd| 亚洲福利视频一区| 国产精品久久久国产盗摄| 亚洲第一精品电影| 亚洲av成人无码网天堂| 久久大大胆人体| 啦啦啦中文在线观看日本| 国产精品夜色7777狼人| 精品国产亚洲一区二区三区大结局| 欧美午夜欧美| 久久久久免费av| 欧美日韩福利在线| 国产一区欧美一区| 在线成人精品视频| 国产精品久久久久久福利一牛影视| 日韩av电影网址| 欧美日韩成人综合| 黄色av免费在线看| 精品国偷自产在线| 深夜视频一区二区| 国产一区二区三区色淫影院| 欧美成人tv| www.日本xxxx| 99精品视频在线免费观看| 亚洲女人毛茸茸高潮| 在线观看日韩毛片| 精品人妻少妇嫩草av无码专区| 日韩中文字幕av| 成人国产激情在线| 国产精品手机视频| 91麻豆精品国产91久久久平台|