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

內存泄露的原因找到了,罪魁禍首居然是Java TheadLocal

開發 后端
組內來了一個實習生,看這小伙子春光滿面、精神抖擻、頭發微少,我心頭一喜:絕對是個潛力股。

[[348543]]

 

本文轉載自微信公眾號「愛笑的架構師」,作者雷架 。轉載本文請聯系愛笑的架構師公眾號。

ThreadLocal使用不規范,師傅兩行淚

組內來了一個實習生,看這小伙子春光滿面、精神抖擻、頭發微少,我心頭一喜:絕對是個潛力股。于是我找經理申請親自來帶他,為了幫助小伙子快速成長,我給他分了一個需求,這不需求剛上線幾天就出網上問題了😭后臺監控服務發現內存一直在緩慢上升,初步懷疑是內存泄露。

把實習生的PR都找出來仔細review,果然發現問題了。由于公司內部代碼是保密的,這里簡單寫一個demo還原場景(忽略代碼風格問題)。

  1. public class ThreadPoolDemo { 
  2.     private static final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>()); 
  3.     public static void main(String[] args) throws InterruptedException { 
  4.         for (int i = 0; i < 100; ++i) { 
  5.             poolExecutor.execute(new Runnable() { 
  6.                 @Override 
  7.                 public void run() { 
  8.                     ThreadLocal<BigObject> threadLocal = new ThreadLocal<>(); 
  9.                     threadLocal.set(new BigObject()); 
  10.                     // 其他業務代碼 
  11.                 } 
  12.             }); 
  13.             Thread.sleep(1000); 
  14.         } 
  15.     } 
  16.     static class BigObject { 
  17.         // 100M 
  18.         private byte[] bytes = new byte[100 * 1024 * 1024]; 
  19.     } 

代碼分析:

  • 創建一個核心線程數和最大線程數都為10的線程池,保證線程池里一直會有10個線程在運行。
  • 使用for循環向線程池中提交了100個任務。
  • 定義了一個ThreadLocal類型的變量,Value類型是大對象。
  • 每個任務會向threadLocal變量里塞一個大對象,然后執行其他業務邏輯。
  • 由于沒有調用線程池的shutdown方法,線程池里的線程還是會在運行。

乍一看這代碼好像沒有什么問題,那為什么會導致服務GC后內存還高居不下呢?

代碼中給threadLocal賦值了一個大的對象,但是執行完業務邏輯后沒有調用remove方法,最后導致線程池中10個線程的threadLocals變量中包含的大對象沒有被釋放掉,出現了內存泄露。

大家說說這樣的實習生還能留不?

ThreadLocal的value值存在哪里?

實習生說他以為線程任務結束了threadLocal賦值的對象會被JVM垃圾回收,很疑惑為什么會出現內存泄露。作為師傅我肯定要給他把原理講透呀。

ThreadLocal類提供set/get方法存儲和獲取value值,但實際上ThreadLocal類并不存儲value值,真正存儲是靠ThreadLocalMap這個類,ThreadLocalMap是ThreadLocal的一個靜態內部類,它的key是ThreadLocal實例對象,value是任意Object對象。

ThreadLocalMap類的定義

  1. static class ThreadLocalMap { 
  2.     // 定義一個table數組,存儲多個threadLocal對象及其value值 
  3.     private Entry[] table
  4.     ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) { 
  5.         table = new Entry[INITIAL_CAPACITY]; 
  6.         int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1); 
  7.         table[i] = new Entry(firstKey, firstValue); 
  8.         size = 1; 
  9.         setThreshold(INITIAL_CAPACITY); 
  10.     } 
  11.     // 定義一個Entry類,key是一個弱引用的ThreadLocal對象 
  12.     // value是任意對象 
  13.     static class Entry extends WeakReference<ThreadLocal<?>> { 
  14.         /** The value associated with this ThreadLocal. */ 
  15.         Object value; 
  16.         Entry(ThreadLocal<?> k, Object v) { 
  17.             super(k); 
  18.             value = v; 
  19.         } 
  20.     } 
  21.     // 省略其他 

進一步分析ThreadLocal類的代碼,看set和get方法如何與ThreadLocalMap靜態內部類關聯上。

ThreadLocal類set方法

  1. public class ThreadLocal<T> { 
  2.  public void set(T value) { 
  3.         Thread t = Thread.currentThread(); 
  4.         ThreadLocalMap map = getMap(t); 
  5.         if (map != null
  6.             map.set(this, value); 
  7.         else 
  8.             createMap(t, value); 
  9.     } 
  10.  
  11.     ThreadLocalMap getMap(Thread t) { 
  12.         return t.threadLocals; 
  13.     } 
  14.  
  15.     void createMap(Thread t, T firstValue) { 
  16.         t.threadLocals = new ThreadLocalMap(this, firstValue); 
  17.     } 
  18.     // 省略其他方法 

set的邏輯比較簡單,就是獲取當前線程的ThreadLocalMap,然后往map里添加KV,K是當前ThreadLocal實例,V是我們傳入的value。這里需要注意一下,map的獲取是需要從Thread類對象里面取,看一下Thread類的定義。

  1. public class Thread implements Runnable { 
  2.     ThreadLocal.ThreadLocalMap threadLocals = null
  3.     //省略其他 

Thread類維護了一個ThreadLocalMap的變量引用。

ThreadLocal類get方法

get獲取當前線程的對應的私有變量,是之前set或者通過initialValue的值,代碼如下:

  1. class ThreadLocal<T> { 
  2.     public T get() { 
  3.         Thread t = Thread.currentThread(); 
  4.         ThreadLocalMap map = getMap(t); 
  5.         if (map != null) { 
  6.             ThreadLocalMap.Entry e = map.getEntry(this); 
  7.             if (e != null
  8.                 return (T)e.value; 
  9.         } 
  10.         return setInitialValue(); 
  11.     } 

代碼邏輯分析:

  • 獲取當前線程的ThreadLocalMap實例;
  • 如果不為空,以當前ThreadLocal實例為key獲取value;
  • 如果ThreadLocalMap為空或者根據當前ThreadLocal實例獲取的value為空,則執行setInitialValue();

ThreadLocal相關類的關系總結

看了上面的分析是不是對Thread,ThreadLocal,ThreadLocalMap,Entry這幾個類之間的關系有點暈了,沒關系我專門畫了一個UML類圖來總結(忽略UML標準語法)。

 

 


ThreadLocal相關類的關系

 

 

  • 每個線程是一個Thread實例,其內部維護一個threadLocals的實例成員,其類型是ThreadLocal.ThreadLocalMap。
  • 通過實例化ThreadLocal實例,我們可以對當前運行的線程設置一些線程私有的變量,通過調用ThreadLocal的set和get方法存取。
  • ThreadLocal本身并不是一個容器,我們存取的value實際上存儲在ThreadLocalMap中,ThreadLocal只是作為TheadLocalMap的key。
  • 每個線程實例都對應一個TheadLocalMap實例,我們可以在同一個線程里實例化很多個ThreadLocal來存儲很多種類型的值,這些ThreadLocal實例分別作為key,對應各自的value,最終存儲在Entry table數組中。
  • 當調用ThreadLocal的set/get進行賦值/取值操作時,首先獲取當前線程的ThreadLocalMap實例,然后就像操作一個普通的map一樣,進行put和get。

ThreadLocal內存模型原理

經過上面的分析我們對ThreadLocal相關的類設計已經非常清楚了,下面通過一張圖更加深入理解一下ThreadLocal的內存存儲。

 

 


ThreadLocal內存模型

 

 

圖中左邊是棧,右邊是堆。線程的一些局部變量和引用使用的內存屬于Stack(棧)區,而普通的對象是存儲在Heap(堆)區。

  • 線程運行時,我們定義的TheadLocal對象被初始化,存儲在Heap,同時線程運行的棧區保存了指向該實例的引用,也就是圖中的ThreadLocalRef。
  • 當ThreadLocal的set/get被調用時,虛擬機會根據當前線程的引用也就是CurrentThreadRef找到其對應在堆區的實例,然后查看其對用的TheadLocalMap實例是否被創建,如果沒有,則創建并初始化。
  • Map實例化之后,也就拿到了該ThreadLocalMap的句柄,那么就可以將當前ThreadLocal對象作為key,進行存取操作。
  • 圖中的虛線,表示key對應ThreadLocal實例的引用是個弱引用。

強引用弱引用的概念

ThreadLocalMap的key是一個弱引用類型,源代碼如下:

  1. static class ThreadLocalMap { 
  2.     // 定義一個Entry類,key是一個弱引用的ThreadLocal對象 
  3.     // value是任意對象 
  4.     static class Entry extends WeakReference<ThreadLocal<?>> { 
  5.         /** The value associated with this ThreadLocal. */ 
  6.         Object value; 
  7.         Entry(ThreadLocal<?> k, Object v) { 
  8.             super(k); 
  9.             value = v; 
  10.         } 
  11.     } 
  12.     // 省略其他 

下面解釋一下常見的幾種引用概念。

強引用

一直活著:類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象實例。

弱引用

回收就會死亡:被弱引用關聯的對象實例只能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前內存是否足夠,都會回收掉只被弱引用關聯的對象實例。在JDK 1.2之后,提供了WeakReference類來實現弱引用。

軟引用

有一次活的機會:軟引用關聯著的對象,在系統將要發生內存溢出異常之前,將會把這些對象實例列進回收范圍之中進行第二次回收。如果這次回收還沒有足夠的內存,才會拋出內存溢出異常。在JDK 1.2之后,提供了SoftReference類來實現軟引用。

虛引用

也稱為幽靈引用或者幻影引用,它是最弱的一種引用關系。一個對象實例是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。為一個對象設置虛引用關聯的唯一目的就是能在這個對象實例被收集器回收時收到一個系統通知。在JDK 1.2之后,提供了PhantomReference類來實現虛引用。

內存泄露是不是弱引用的鍋?

從表面上看內存泄漏的根源在于使用了弱引用,但是另一個問題也同樣值得思考:為什么ThreadLocalMap使用弱引用而不是強引用?

翻看官網文檔的說法:

To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys.

為了處理非常大和長期的用途,哈希表條目使用weakreference作為鍵。

分兩種情況討論:

(1)key 使用強引用

引用ThreadLocal的對象被回收了,但是ThreadLocalMap還持有ThreadLocal的強引用,如果沒有手動刪除,ThreadLocal不會被回收,導致Entry內存泄漏。

(2)key 使用弱引

引用ThreadLocal的對象被回收了,由于ThreadLocalMap持有ThreadLocal的弱引用,即使沒有手動刪除,ThreadLocal也會被回收。value在下一次ThreadLocalMap調用set、get、remove的時候會被清除。

比較兩種情況,我們可以發現:由于ThreadLocalMap的生命周期跟Thread一樣長,如果都沒有手動刪除對應key,都會導致內存泄漏,但是使用弱引用可以多一層保障:弱引用ThreadLocal被清理后key為null,對應的value在下一次ThreadLocalMap調用set、get、remove的時候可能會被清除。

因此,ThreadLocal內存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一樣長,如果沒有手動刪除對應key就會導致內存泄漏,而不是因為弱引用。

ThreadLocal最佳實踐

通過前面幾小節我們分析了ThreadLocal的類設計以及內存模型,同時也重點分析了發生內存泄露的條件和特定場景。最后結合項目中的經驗給出建議使用ThreadLocal的場景:

  • 當需要存儲線程私有變量的時候。
  • 當需要實現線程安全的變量時。
  • 當需要減少線程資源競爭的時候。

綜合上面的分析,我們可以理解ThreadLocal內存泄漏的前因后果,那么怎么避免內存泄漏呢?

答案就是:每次使用完ThreadLocal,建議調用它的remove()方法,清除數據。

另外需要強調的是并不是所有使用ThreadLocal的地方,都要在最后remove(),因為他們的生命周期可能是需要和項目的生存周期一樣長的,所以要進行恰當的選擇,以免出現業務邏輯錯誤!

責任編輯:武曉燕 來源: 愛笑的架構師
相關推薦

2020-12-01 06:58:29

富領域模型服務

2025-09-08 08:56:00

OpenAI論文模型

2019-06-04 14:19:53

AWS谷歌巖機

2015-11-23 10:29:48

app隱藏通信安卓耗電

2011-04-21 16:34:56

打印亂碼接口

2009-02-25 08:58:30

裁員上網本微軟

2019-05-27 10:22:26

Oracle日志數據庫

2015-10-14 11:04:53

2020-06-15 14:36:15

2024-10-08 15:37:56

2009-10-12 19:44:40

Windows 7閃屏解決辦法

2009-06-03 08:48:26

2020-10-19 06:49:18

內存String

2021-12-12 21:51:54

人工智能銀行內卷

2015-10-14 11:32:55

機房空調制冷

2023-07-25 13:40:46

AI模型

2015-02-26 13:34:28

2009-03-20 16:10:15

2021-09-06 11:39:39

筆記本噪音風扇

2011-08-12 10:04:52

數據中心宕機EPO
點贊
收藏

51CTO技術棧公眾號

涩涩视频在线观看免费| 久久久久久视频| 免费亚洲电影| 国产精品不卡视频| 超碰97在线人人| 好吊妞视频一区二区三区| 九九久久精品| 欧美一区二区三区小说| 亚洲美免无码中文字幕在线| www日韩tube| 粉嫩久久99精品久久久久久夜| 欧美性资源免费| 国产免费一区二区三区四区| 国产精品99久久免费观看| 欧美亚一区二区| 国产成人永久免费视频| 福利在线视频导航| 豆国产96在线|亚洲| 国产精品激情自拍| 国产真实的和子乱拍在线观看| 精品高清久久| 精品国产网站在线观看| 中文久久久久久| caoporn视频在线| 亚洲少妇30p| 欧美高清一区二区| www五月婷婷| 免费在线欧美视频| 欧美专区在线视频| 欧美精品xxxxx| 久久裸体网站| 亚洲人成网站999久久久综合| 黑人巨大猛交丰满少妇| 成人久久网站| 色噜噜狠狠一区二区三区果冻| 美女黄色免费看| 日本中文字幕在线视频| 国产日韩欧美不卡| 麻豆亚洲一区| 手机看片一区二区三区| 国产·精品毛片| 2014国产精品| 国产精品久久久久久久免费看| 日韩电影免费在线观看网站| 2020欧美日韩在线视频| 国产精品18p| 综合天堂av久久久久久久| 日韩最新免费不卡| 国产又粗又猛又爽又黄的视频四季| 欧美日韩一区二区三区四区不卡 | 国产亚洲观看| 欧美日韩国产精选| 国产天堂在线播放| 日韩电影网站| 色婷婷av一区二区三区软件| 狠狠97人人婷婷五月| bbw在线视频| 亚洲第一久久影院| 亚洲精品久久久久久久蜜桃臀| 超碰在线免费播放| 国产另类在线| 久久综合久色欧美综合狠狠| 精品久久久久久一区二区里番| 国产成人精品毛片| 精品一区二区在线看| 国产日韩精品电影| 国产老妇伦国产熟女老妇视频| 麻豆精品新av中文字幕| 国产欧亚日韩视频| 97精品人妻一区二区三区香蕉| 极品少妇一区二区| 99在线免费观看视频| 日本激情一区二区| 久久综合九色综合欧美98| 日本黑人久久| 日本高清视频在线观看| 亚洲欧美另类久久久精品| 国产日韩欧美大片| av福利在线导航| 精品欧美aⅴ在线网站| 日本在线观看a| yy6080久久伦理一区二区| 欧美精品v国产精品v日韩精品 | 亚洲成人va| 欧美视频一二三区| 免费网站在线观看黄| 一区二区三区国产好| 日韩电影网在线| 亚洲不卡的av| 精品1区2区3区4区| 日韩av黄色在线观看| 在线免费a视频| 国产精品一区在线| 欧美一区二区三区四区夜夜大片 | 欧美调教视频| 尤物九九久久国产精品的特点 | 欧美日韩亚洲激情| www.色就是色| 国产区精品视频在线观看豆花| 亚洲天堂av电影| 欧美交换国产一区内射| 久久九九精品| 99精品在线直播| 黄色在线免费观看大全| 亚洲精品国产视频| 国产男女激情视频| 亚洲啊v在线免费视频| 亚洲乱码一区av黑人高潮| 国产福利视频网站| 蜜桃av综合| 亚洲最大的免费| 韩国三级在线观看久| 亚洲六月丁香色婷婷综合久久| av动漫在线看| 秋霞影院一区| 一本一本久久a久久精品牛牛影视| 久久久久无码国产精品不卡| 日韩电影在线看| 久久99欧美| 羞羞网站在线看| 欧美日韩免费观看一区二区三区| 呦呦视频在线观看| 亚洲精品二区三区| 国产精品激情自拍| 亚洲色偷精品一区二区三区| 一二三区精品福利视频| 亚洲精品20p| 国产一区毛片| 91国语精品自产拍在线观看性色| 国产特黄一级片| 中文字幕高清一区| 人妻熟女一二三区夜夜爱| 日韩一二三区| 久久久极品av| 中文字幕欧美人妻精品| 久久综合色鬼综合色| 日本在线xxx| 精品欧美午夜寂寞影院| 欧美激情一级二级| av中文字幕免费| 亚洲欧洲国产日本综合| 91小视频网站| 日韩精品一区二区三区免费观影| 国产精品va在线播放| 狠狠色伊人亚洲综合网站l| 欧美日韩国产精品专区| 精品国产av色一区二区深夜久久 | 亚洲国产高清在线| 黑鬼大战白妞高潮喷白浆| 欧美深夜视频| 清纯唯美日韩制服另类| 三级无遮挡在线观看| 欧美日韩激情网| 亚洲一区二区乱码| 欧美亚洲专区| 日本不卡二区高清三区| 欧美日韩成人影院| 最近2019好看的中文字幕免费 | 中文字幕资源网在线观看免费| 日韩av一区二区在线观看| 日韩精品成人在线| 99r国产精品| 久久久久久久久久福利| 欧美熟乱15p| 91精品视频网站| 日本性爱视频在线观看| 亚洲第一综合天堂另类专| 日本午夜小视频| 91蝌蚪国产九色| 国产自偷自偷免费一区| 国产电影一区二区在线观看| 成人写真福利网| 欧美另类tv| 亚洲精品国产电影| 草莓视频18免费观看| 国产精品久久精品日日| 波多野结衣中文字幕在线播放| 狠狠综合久久| 欧美大香线蕉线伊人久久国产精品| 美女网站视频一区| 日韩视频在线观看免费| 午夜免费福利视频| 色婷婷综合久久| 三上悠亚在线观看视频| 成人性色生活片免费看爆迷你毛片| 日韩欧美视频网站| 日韩欧美视频在线播放| av免费观看久久| 亚洲第一二三四区| 久久综合五月天| 日本免费一区二区三区最新| 欧美久久一区二区| 日本三级网站在线观看| 国产午夜精品福利| 永久av免费在线观看| 国产欧美精品久久| 桥本有菜av在线| 奇米777国产一区国产二区| 国产美女精品免费电影| av电影院在线看| xvideos亚洲人网站| 香蕉av在线播放| 91精品久久久久久久久99蜜臂| 一级片中文字幕| 亚洲视频一二三| 成人免费无遮挡无码黄漫视频| 寂寞少妇一区二区三区| 爱福利视频一区二区| 伊人久久大香线| 日产精品一线二线三线芒果| 中文字幕一区二区三区中文字幕 | 在线免费一级片| 香蕉成人啪国产精品视频综合网| 超碰人人干人人| a级高清视频欧美日韩| 久国产精品视频| 丝袜美腿一区二区三区| 日韩免费在线观看av| 日韩在线综合| 欧美一区二区视频17c| 成人激情自拍| 亚洲自拍偷拍色图| 九九热这里有精品| 国产福利精品在线| 538视频在线| 欧美肥婆姓交大片| 免费高清完整在线观看| 欲色天天网综合久久| 青青草在线视频免费观看| 欧美精品一区二区在线播放| 国产99对白在线播放| 欧美日韩不卡一区二区| 无码人妻精品一区二区蜜桃色欲| 亚洲成av人在线观看| 成人观看免费视频| 中文字幕一区二区日韩精品绯色| 这里只有久久精品| 久久奇米777| 日韩 中文字幕| 99久久免费国产| aaaaaav| 成人av一区二区三区| 中文字幕制服丝袜| 国产凹凸在线观看一区二区| 久久久国产精品久久久| 国产精品99久久久久久久女警 | 天天爱天天做天天爽| 欧美日韩激情视频| 美日韩一二三区| 五月婷婷久久丁香| 亚洲黄色三级视频| 亚洲国产精品视频| 五月天婷婷网站| 精品久久久久久久久久久| 日本一级淫片色费放| 亚洲成人免费在线| 91在线看视频| 日本精品一区二区三区四区的功能| 久久精品国产成人av| 色婷婷狠狠综合| 中文字幕日韩经典| 欧美麻豆精品久久久久久| 国产乱子伦精品无码码专区| 日韩免费视频一区| 熟妇高潮一区二区三区| 亚洲男人天天操| 草碰在线视频| 欧美老女人xx| 国产美女高潮在线观看| 日本在线观看天堂男亚洲 | 精品69视频一区二区三区Q| 无码粉嫩虎白一线天在线观看| 一区二区动漫| 国产精品视频黄色| 狠狠色狠狠色合久久伊人| 手机在线播放av| 2024国产精品| 91制片厂在线| 亚洲电影一级黄| www毛片com| 欧美美女黄视频| 天堂中文在线官网| 中文字幕亚洲欧美日韩2019| 影音先锋男人在线资源| 欧美怡红院视频一区二区三区| 成人日韩在线| 亚洲精品女av网站| 日韩精品福利一区二区三区| 一区二区精品视频| 亚洲大片av| 五月婷婷激情久久| 粉嫩一区二区三区在线看| 亚洲精品国产熟女久久久| 亚洲日本韩国一区| 亚洲欧美自拍视频| 欧美一区二区视频免费观看| 欧美孕妇性xxxⅹ精品hd| 久久精品成人欧美大片古装| 黑森林国产精品av| 国产欧美 在线欧美| 美女av一区| 一区二区三区我不卡| 国产亚洲精品v| 一级黄色片国产| 久久久不卡网国产精品二区| 欧美黄色免费观看| 精品视频资源站| 视频二区在线| 久久91超碰青草是什么| 992tv国产精品成人影院| 国产乱码一区| 欧美国产91| 黄色片视频在线| 99re6这里只有精品视频在线观看| 国产大屁股喷水视频在线观看| 精品毛片三在线观看| 国产精品久久久久久在线| 亚洲网站在线看| 国产在线美女| 97在线电影| 91精品精品| 一区二区三区 日韩| 久久在线观看免费| www.国产成人| 精品国产乱码久久久久久久| 精品麻豆一区二区三区| 国产精品入口夜色视频大尺度 | 800av免费在线观看| 日韩一级欧美一级| 免费av毛片在线看| 国产精品美女999| 国内精品久久久久久久影视简单 | 日韩欧美综合视频| 日本韩国欧美一区| 婷婷国产在线| 91av中文字幕| 久久99精品国产自在现线| 成人一级生活片| 国产成人免费视频精品含羞草妖精| 国产中文字幕久久| 欧美日韩精品是欧美日韩精品| 国产黄色片在线播放| 日韩av大片免费看| 综合亚洲自拍| av免费在线播放网站| 91伊人久久大香线蕉| 免费看日韩毛片| 精品视频—区二区三区免费| 日本乱码一区二区三区不卡| 久久国产一区二区| 亚洲欧美日韩精品一区二区 | 亚洲精品视频在线观看网站| 国产精品久久影视| 久久这里只有精品视频首页| 91麻豆精品一二三区在线| 在线看视频不卡| 国产精品中文欧美| 欧美黄色免费观看| 精品粉嫩aⅴ一区二区三区四区 | 亚洲一区二区中文在线| 国产极品999| 久久久久国产精品www| 精品女人视频| 黄色高清无遮挡| 中文字幕在线观看不卡| 精品国产av一区二区| 久久久久久久久久久人体| 日本欧美三级| 男人插女人下面免费视频| 国产精品久久久久久久久免费相片| 国产精品老熟女视频一区二区| 精品中文字幕乱| 猫咪成人在线观看| 国产精品亚洲二区在线观看| 国产精品午夜在线| 国产成人精品白浆久久69| 高清一区二区三区四区五区| 自拍偷拍一区| 99999精品| 欧美午夜丰满在线18影院| 98在线视频| 国产精品一区二区三区免费| 日韩在线a电影| 久操视频免费在线观看| 亚洲精品电影网在线观看| 精品176极品一区| 亚洲乱码日产精品bd在线观看| 91免费看`日韩一区二区| 最新中文字幕免费| 欧美国产日韩一区二区三区| 免费精品国产的网站免费观看| 婷婷免费在线观看| 亚洲狠狠爱一区二区三区| 国产精品99999| 1卡2卡3卡精品视频| 麻豆亚洲精品| 欧美成人免费观看视频| 亚洲天堂免费在线| 国产精品极品| 蜜臀av免费观看|