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

Java 理論與實踐: 用弱引用堵住內(nèi)存泄漏

開發(fā) 后端
雖然用 Java語言編寫的程序在理論上是不會出現(xiàn)“內(nèi)存泄漏”的,但是有時對象在不再作為程序的邏輯狀態(tài)的一部分之后仍然不被垃圾收集。本文探討了無意識的對象保留的常見原因,并展示了如何用弱引用堵住泄漏。

要讓垃圾收集(GC)回收程序不再使用的對象,對象的邏輯 生命周期(應(yīng)用程序使用它的時間)和對該對象擁有的引用的實際 生命周期必須是相同的。在大多數(shù)時候,好的軟件工程技術(shù)保證這是自動實現(xiàn)的,不用我們對對象生命周期問題花費過多心思。但是偶爾我們會創(chuàng)建一個引用,它在內(nèi)存中包含對象的時間比我們預(yù)期的要長得多,這種情況稱為無意識的對象保留(unintentional object retention)。

無意識對象保留最常見的原因是使用 Map 將元數(shù)據(jù)與臨時對象(transient object)相關(guān)聯(lián)。假定一個對象具有中等生命周期,比分配它的那個方法調(diào)用的生命周期長,但是比應(yīng)用程序的生命周期短,如客戶機的套接字連接。需要將一些元數(shù)據(jù)與這個套接字關(guān)聯(lián),如生成連接的用戶的標(biāo)識。在創(chuàng)建 Socket 時是不知道這些信息的,并且不能將數(shù)據(jù)添加到 Socket 對象上,因為不能控制 Socket 類或者它的子類。這時,典型的方法就是在一個全局 Map 中存儲這些信息,如清單 1 中的 SocketManager 類所示:

  1. public class SocketManager {  
  2.     private Map< Socket,User> m = new HashMap< Socket,User>();  
  3.       
  4.     public void setUser(Socket s, User u) {  
  5.         m.put(s, u);  
  6.     }  
  7.     public User getUser(Socket s) {  
  8.         return m.get(s);  
  9.     }  
  10.     public void removeUser(Socket s) {  
  11.         m.remove(s);  
  12.     }  
  13. }  
  14. SocketManager socketManager;  
  15. ...  
  16. socketManager.setUser(socket, user); 

這種方法的問題是元數(shù)據(jù)的生命周期需要與套接字的生命周期掛鉤,但是除非準(zhǔn)確地知道什么時候程序不再需要這個套接字,并記住從 Map 中刪除相應(yīng)的映射,否則,Socket 和 User 對象將會永遠(yuǎn)留在 Map 中,遠(yuǎn)遠(yuǎn)超過響應(yīng)了請求和關(guān)閉套接字的時間。這會阻止 Socket 和 User 對象被垃圾收集,即使應(yīng)用程序不會再使用它們。這些對象留下來不受控制,很容易造成程序在長時間運行后內(nèi)存爆滿。除了最簡單的情況,在幾乎所有情況下找出什么時候 Socket 不再被程序使用是一件很煩人和容易出錯的任務(wù),需要人工對內(nèi)存進行管理。

程序有內(nèi)存泄漏的第一個跡象通常是它拋出一個 OutOfMemoryError,或者因為頻繁的垃圾收集而表現(xiàn)出糟糕的性能。幸運的是,垃圾收集可以提供能夠用來診斷內(nèi)存泄漏的大量信息。如果以 -verbose:gc 或者 -Xloggc 選項調(diào)用 JVM,那么每次 GC 運行時在控制臺上或者日志文件中會打印出一個診斷信息,包括它所花費的時間、當(dāng)前堆使用情況以及恢復(fù)了多少內(nèi)存。記錄 GC 使用情況并不具有干擾性,因此如果需要分析內(nèi)存問題或者調(diào)優(yōu)垃圾收集器,在生產(chǎn)環(huán)境中默認(rèn)啟用 GC 日志是值得的。

有工具可以利用 GC 日志輸出并以圖形方式將它顯示出來,JTune 就是這樣的一種工具(請參閱 參考資料)。觀察 GC 之后堆大小的圖,可以看到程序內(nèi)存使用的趨勢。對于大多數(shù)程序來說,可以將內(nèi)存使用分為兩部分:baseline 使用和 current load 使用。對于服務(wù)器應(yīng)用程序,baseline 使用就是應(yīng)用程序在沒有任何負(fù)荷、但是已經(jīng)準(zhǔn)備好接受請求時的內(nèi)存使用,current load 使用是在處理請求過程中使用的、但是在請求處理完成后會釋放的內(nèi)存。只要負(fù)荷大體上是恒定的,應(yīng)用程序通常會很快達(dá)到一個穩(wěn)定的內(nèi)存使用水平。如果在應(yīng)用程序已經(jīng)完成了其初始化并且負(fù)荷沒有增加的情況下,內(nèi)存使用持續(xù)增加,那么程序就可能在處理前面的請求時保留了生成的對象。

清單 2 展示了一個有內(nèi)存泄漏的程序。MapLeaker 在線程池中處理任務(wù),并在一個 Map 中記錄每一項任務(wù)的狀態(tài)。不幸的是,在任務(wù)完成后它不會刪除那一項,因此狀態(tài)項和任務(wù)對象(以及它們的內(nèi)部狀態(tài))會不斷地積累。

  1. public class MapLeaker {  
  2.     public ExecutorService exec = Executors.newFixedThreadPool(5);  
  3.     public Map< Task, TaskStatus> taskStatus   
  4.         = Collections.synchronizedMap(new HashMap< Task, TaskStatus>());  
  5.     private Random random = new Random();  
  6.     private enum TaskStatus { NOT_STARTED, STARTED, FINISHED };  
  7.     private class Task implements Runnable {  
  8.         private int[] numbers = new int[random.nextInt(200)];  
  9.         public void run() {  
  10.             int[] temp = new int[random.nextInt(10000)];  
  11.             taskStatus.put(this, TaskStatus.STARTED);  
  12.             doSomeWork();  
  13.             taskStatus.put(this, TaskStatus.FINISHED);  
  14.         }  
  15.     }  
  16.     public Task newTask() {  
  17.         Task t = new Task();  
  18.         taskStatus.put(t, TaskStatus.NOT_STARTED);  
  19.         exec.execute(t);  
  20.         return t;  
  21.     }  

圖 1 顯示 MapLeaker GC 之后應(yīng)用程序堆大小隨著時間的變化圖。上升趨勢是存在內(nèi)存泄漏的警示信號。(在真實的應(yīng)用程序中,坡度不會這么大,但是在收集了足夠長時間的 GC 數(shù)據(jù)后,上升趨勢通常會表現(xiàn)得很明顯。)

MapLeaker GC 之后應(yīng)用程序堆大小隨著時間的變化圖

確信有了內(nèi)存泄漏后,下一步就是找出哪種對象造成了這個問題。所有內(nèi)存分析器都可以生成按照對象類進行分解的堆快照。有一些很好的商業(yè)堆分析工具,但是找出內(nèi)存泄漏不一定要花錢買這些工具 —— 內(nèi)置的 hprof 工具也可完成這項工作。要使用 hprof 并讓它跟蹤內(nèi)存使用,需要以 -Xrunhprof:heap=sites 選項調(diào)用 JVM。

清單 3 顯示分解了應(yīng)用程序內(nèi)存使用的 hprof 輸出的相關(guān)部分。(hprof 工具在應(yīng)用程序退出時,或者用 kill -3 或在 Windows 中按 Ctrl+Break 時生成使用分解。)注意兩次快照相比,Map.Entry、Task 和 int[] 對象有了顯著增加。

  1. SITES BEGIN (ordered by live bytes) Fri Oct 28 16:30:48 2005  
  2.           percent          live          alloc'ed  stack class  
  3.  rank   self  accum     bytes objs     bytes  objs trace name 
  4.     1 70.13% 70.13%   5694888 13909   5694888 13909 300305 int[]  
  5.     2 18.27% 88.40%   1483976   68 278273632 13908 300321 int[]  
  6.     3  4.11% 92.51%    333816 13909    333816 13909 300310 java.util.HashMap$Entry  
  7.     4  2.74% 95.25%    222544 13909    222544 13909 300304 com.quiotix.dummy.MapLeaker$Task  
  8.     5  2.42% 97.67%    196640    2    262192    11 300325 java.util.HashMap$Entry[]  
  9.     6  0.66% 98.33%     53680 3355    222464 13904 300324 java.util.concurrent.LinkedBlockingQueue$Node  
  10. SITES END 
  11. SITES BEGIN (ordered by live bytes) Fri Oct 28 16:31:32 2005  
  12.           percent          live          alloc'ed  stack class  
  13.  rank   self  accum     bytes objs     bytes  objs trace name 
  14.     1 77.07% 77.07%  41176024 100020  41176024 100020 301069 int[]  
  15.     2 12.98% 90.05%   6933768  359 2001885688 100020 301093 int[]  
  16.     3  4.49% 94.55%   2400480 100020   2400480 100020 301082 java.util.HashMap$Entry  
  17.     4  3.00% 97.54%   1600320 100020   1600320 100020 301068 com.quiotix.dummy.MapLeaker$Task  
  18.     5  1.96% 99.50%   1048592    1   2097248    14 301104 java.util.HashMap$Entry[]  
  19.     6  0.05% 99.55%     25936 1621   1600240 100015 301101 java.util.concurrent.LinkedBlockingQueue$Node  
  20. SITES END 

清單 4 展示了 hprof 輸出的另一部分,給出了 Map.Entry 對象的分配點的調(diào)用堆棧信息。這個輸出告訴我們哪些調(diào)用鏈生成了 Map.Entry 對象,并帶有一些程序分析,找出內(nèi)存泄漏來源一般來說是相當(dāng)容易的。

  1. TRACE 300446:  
  2.  java.util.HashMap$Entry.< init>(< Unknown Source>:Unknown line)  
  3.  java.util.HashMap.addEntry(< Unknown Source>:Unknown line)  
  4.  java.util.HashMap.put(< Unknown Source>:Unknown line)  
  5.  java.util.Collections$SynchronizedMap.put(< Unknown Source>:Unknown line)  
  6.  com.quiotix.dummy.MapLeaker.newTask(MapLeaker.java:48)  
  7.  com.quiotix.dummy.MapLeaker.main(MapLeaker.java:64

SocketManager 的問題是 Socket-User 映射的生命周期應(yīng)當(dāng)與 Socket 的生命周期相匹配,但是語言沒有提供任何容易的方法實施這項規(guī)則。這使得程序不得不使用人工內(nèi)存管理的老技術(shù)。幸運的是,從 JDK 1.2 開始,垃圾收集器提供了一種聲明這種對象生命周期依賴性的方法,這樣垃圾收集器就可以幫助我們防止這種內(nèi)存泄漏 —— 利用弱引用。

#p#

弱引用是對一個對象(稱為 referent)的引用的持有者。使用弱引用后,可以維持對 referent 的引用,而不會阻止它被垃圾收集。當(dāng)垃圾收集器跟蹤堆的時候,如果對一個對象的引用只有弱引用,那么這個 referent 就會成為垃圾收集的候選對象,就像沒有任何剩余的引用一樣,而且所有剩余的弱引用都被清除。(只有弱引用的對象稱為弱可及(weakly reachable)。)

WeakReference 的 referent 是在構(gòu)造時設(shè)置的,在沒有被清除之前,可以用 get() 獲取它的值。如果弱引用被清除了(不管是 referent 已經(jīng)被垃圾收集了,還是有人調(diào)用了 WeakReference.clear()),get() 會返回 null。相應(yīng)地,在使用其結(jié)果之前,應(yīng)當(dāng)總是檢查 get() 是否返回一個非 null 值,因為 referent 最終總是會被垃圾收集的。

用一個普通的(強)引用拷貝一個對象引用時,限制 referent 的生命周期至少與被拷貝的引用的生命周期一樣長。如果不小心,那么它可能就與程序的生命周期一樣 —— 如果將一個對象放入一個全局集合中的話。另一方面,在創(chuàng)建對一個對象的弱引用時,完全沒有擴展 referent 的生命周期,只是在對象仍然存活的時候,保持另一種到達(dá)它的方法。

弱引用對于構(gòu)造弱集合最有用,如那些在應(yīng)用程序的其余部分使用對象期間存儲關(guān)于這些對象的元數(shù)據(jù)的集合 —— 這就是 SocketManager 類所要做的工作。因為這是弱引用最常見的用法,WeakHashMap 也被添加到 JDK 1.2 的類庫中,它對鍵(而不是對值)使用弱引用。如果在一個普通 HashMap 中用一個對象作為鍵,那么這個對象在映射從 Map 中刪除之前不能被回收,WeakHashMap 使您可以用一個對象作為 Map 鍵,同時不會阻止這個對象被垃圾收集。清單 5 給出了 WeakHashMap 的 get() 方法的一種可能實現(xiàn),它展示了弱引用的使用:

  1. public class WeakHashMap< K,V> implements Map< K,V> {  
  2.     private static class Entry< K,V> extends WeakReference< K>   
  3.       implements Map.Entry< K,V> {  
  4.         private V value;  
  5.         private final int hash;  
  6.         private Entry< K,V> next;  
  7.         ...  
  8.     }  
  9.     public V get(Object key) {  
  10.         int hash = getHash(key);  
  11.         Entry< K,V> e = getChain(hash);  
  12.         while (e != null) {  
  13.             K eKey= e.get();  
  14.             if (e.hash == hash && (key == eKey || key.equals(eKey)))  
  15.                 return e.value;  
  16.             e = e.next;  
  17.         }  
  18.         return null;  
  19.     } 

調(diào)用 WeakReference.get() 時,它返回一個對 referent 的強引用(如果它仍然存活的話),因此不需要擔(dān)心映射在 while 循環(huán)體中消失,因為強引用會防止它被垃圾收集。WeakHashMap 的實現(xiàn)展示了弱引用的一種常見用法 —— 一些內(nèi)部對象擴展 WeakReference。其原因在下面一節(jié)討論引用隊列時會得到解釋。

在向 WeakHashMap 中添加映射時,請記住映射可能會在以后“脫離”,因為鍵被垃圾收集了。在這種情況下,get() 返回 null,這使得測試 get() 的返回值是否為 null 變得比平時更重要了。

用 WeakHashMap 堵住泄漏

在 SocketManager 中防止泄漏很容易,只要用 WeakHashMap 代替 HashMap 就行了,如清單 6 所示。(如果 SocketManager 需要線程安全,那么可以用 Collections.synchronizedMap() 包裝 WeakHashMap)。當(dāng)映射的生命周期必須與鍵的生命周期聯(lián)系在一起時,可以使用這種方法。不過,應(yīng)當(dāng)小心不濫用這種技術(shù),大多數(shù)時候還是應(yīng)當(dāng)使用普通的 HashMap 作為 Map 的實現(xiàn)。

  1. public class SocketManager {  
  2.     private Map< Socket,User> m = new WeakHashMap< Socket,User>();  
  3.       
  4.     public void setUser(Socket s, User u) {  
  5.         m.put(s, u);  
  6.     }  
  7.     public User getUser(Socket s) {  
  8.         return m.get(s);  
  9.     }  

WeakHashMap 用弱引用承載映射鍵,這使得應(yīng)用程序不再使用鍵對象時它們可以被垃圾收集,get() 實現(xiàn)可以根據(jù) WeakReference.get() 是否返回 null 來區(qū)分死的映射和活的映射。但是這只是防止 Map 的內(nèi)存消耗在應(yīng)用程序的生命周期中不斷增加所需要做的工作的一半,還需要做一些工作以便在鍵對象被收集后從 Map 中刪除死項。否則,Map 會充滿對應(yīng)于死鍵的項。雖然這對于應(yīng)用程序是不可見的,但是它仍然會造成應(yīng)用程序耗盡內(nèi)存,因為即使鍵被收集了,Map.Entry 和值對象也不會被收集。

可以通過周期性地掃描 Map,對每一個弱引用調(diào)用 get(),并在 get() 返回 null 時刪除那個映射而消除死映射。但是如果 Map 有許多活的項,那么這種方法的效率很低。如果有一種方法可以在弱引用的 referent 被垃圾收集時發(fā)出通知就好了,這就是引用隊列 的作用。

引用隊列是垃圾收集器向應(yīng)用程序返回關(guān)于對象生命周期的信息的主要方法。弱引用有兩個構(gòu)造函數(shù):一個只取 referent 作為參數(shù),另一個還取引用隊列作為參數(shù)。如果用關(guān)聯(lián)的引用隊列創(chuàng)建弱引用,在 referent 成為 GC 候選對象時,這個引用對象(不是 referent)就在引用清除后加入 到引用隊列中。之后,應(yīng)用程序從引用隊列提取引用并了解到它的 referent 已被收集,因此可以進行相應(yīng)的清理活動,如去掉已不在弱集合中的對象的項。(引用隊列提供了與 BlockingQueue 同樣的出列模式 —— polled、timed blocking 和 untimed blocking。)

WeakHashMap 有一個名為 expungeStaleEntries() 的私有方法,大多數(shù) Map 操作中會調(diào)用它,它去掉引用隊列中所有失效的引用,并刪除關(guān)聯(lián)的映射。清單 7 展示了 expungeStaleEntries() 的一種可能實現(xiàn)。用于存儲鍵-值映射的 Entry 類型擴展了 WeakReference,因此當(dāng) expungeStaleEntries() 要求下一個失效的弱引用時,它得到一個 Entry。用引用隊列代替定期掃描內(nèi)容的方法來清理 Map 更有效,因為清理過程不會觸及活的項,只有在有實際加入隊列的引用時它才工作。

  1. private void expungeStaleEntries() {  
  2. ry< K,V> e;  
  3.     while ( (e = (Entry< K,V>) queue.poll()) != null) {  
  4.         int hash = e.hash;  
  5.         Entry< K,V> prev = getChain(hash);  
  6.         Entry< K,V> cur = prev;  
  7.         while (cur != null) {  
  8.             Entry< K,V> next = cur.next;  
  9.             if (cur == e) {  
  10.                 if (prev == e)  
  11.                     setChain(hash, next);  
  12.                 else 
  13.                     prev.next = next;  
  14.                 break;  
  15.             }  
  16.             prev = cur;  
  17.             cur = next;  
  18.         }  
  19.     }  

弱引用和弱集合是對堆進行管理的強大工具,使得應(yīng)用程序可以使用更復(fù)雜的可及性方案,而不只是由普通(強)引用所提供的“要么全部要么沒有”可及性。

【編輯推薦】

  1. Java內(nèi)存泄漏的檢測和處理
  2. 幾種典型的Java內(nèi)存泄漏
  3. 詳細(xì)介紹Java的內(nèi)存管理與內(nèi)存泄露
  4. Java程序性能優(yōu)化之找出內(nèi)存溢出元兇
  5. 20個開發(fā)人員非常有用的Java功能代碼
責(zé)任編輯:yangsai 來源: IBMDW
相關(guān)推薦

2013-08-19 17:14:04

.Net強引用弱引用

2024-03-11 08:22:40

Java內(nèi)存泄漏

2012-08-10 13:55:56

Java動態(tài)代理

2021-01-07 14:20:55

JavaGC

2020-12-02 09:01:40

Java基礎(chǔ)

2017-05-04 16:33:58

Java線程池實踐

2015-03-30 11:18:50

內(nèi)存管理Android

2020-11-11 08:55:32

SparkJava磁盤

2015-04-29 11:23:03

Java理論與實踐 Volatile 變

2023-12-25 09:30:41

Java垃圾回收

2016-09-08 16:16:26

iOS移動應(yīng)用內(nèi)存泄漏

2017-11-09 16:07:00

Web應(yīng)用內(nèi)存

2020-02-09 17:23:17

Python數(shù)據(jù)字典

2012-03-21 10:09:12

2015-11-02 17:20:00

Java弱引用

2012-04-28 09:54:16

Java

2010-06-21 11:08:27

微軟安全漏洞

2009-06-10 22:03:40

JavaScript內(nèi)IE內(nèi)存泄漏

2019-01-30 18:24:14

Java內(nèi)存泄漏編程語言

2024-05-20 08:58:13

Java引用類型垃圾回收器
點贊
收藏

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

欧美亚洲大陆| jizz在线观看视频| 91久久中文| 亚洲精品国产精品乱码不99按摩| 亚洲熟妇av一区二区三区| 黄色在线小视频| 国内精品第一页| 98精品国产高清在线xxxx天堂| 无码人妻精品一区二区中文| 超碰国产精品一区二页| 亚洲va欧美va人人爽午夜 | 日韩在线视频免费播放| sdde在线播放一区二区| 亚洲成人黄色网| 男女无套免费视频网站动漫| 欧美黄色视屏| 日本一二三四高清不卡| 国产激情美女久久久久久吹潮| 好吊色在线视频| 欧美精品三区| 一本色道久久综合狠狠躁篇的优点 | 欧美日韩在线精品一区二区三区激情综 | 乱子伦一区二区三区| 欧美1区视频| 亚洲一区二区国产| 亚洲国产精品第一页| 91精品国产66| 欧美网站在线观看| 超碰人人爱人人| 色三级在线观看| 91看片淫黄大片一级| 91高跟黑色丝袜呻吟在线观看| 无码人妻一区二区三区线| 欧美视频日韩| 久久国产精品首页| 国产又粗又猛又爽又黄的视频四季| 999在线精品| 777xxx欧美| 天天干天天综合| 三上悠亚亚洲一区| 精品国产91久久久久久| 996这里只有精品| 色影视在线观看| 中文字幕 久热精品 视频在线| 国产日韩欧美一区二区三区四区| 国产情侣一区二区| 久久精品国产在热久久| 国产精品久久久久av| 久久久久久久久久影院| 亚洲视频狠狠| 欧美激情免费在线| 久久久久黄色片| 综合色一区二区| 久青草国产97香蕉在线视频| 亚洲欧美另类日本| 日韩欧美1区| 国产一区二区三区四区福利| 国精产品一区一区三区免费视频| 欧美午夜18电影| 亚洲精品国产拍免费91在线| 91丝袜超薄交口足| 国产一区二区三区免费在线 | 日本xxxxxxx免费视频| 欧美巨大丰满猛性社交| 天天做天天摸天天爽国产一区| 久久久久久久久久网| 888av在线视频| 黑人狂躁日本妞一区二区三区 | 国产7777777| 欧美中文一区二区| 日韩中文理论片| 老司机深夜福利网站| 天天做天天爱天天爽综合网| 久久国产精品久久久久久| 欧美性猛交xxxxx少妇| 欧美视频官网| 97在线日本国产| 91video| 丝瓜av网站精品一区二区| 日韩美女免费视频| 中文字幕二区三区| 国产成人免费在线观看不卡| 国产免费一区| 国产中文字幕在线看| 中文字幕一区二区5566日韩| 久久久无码中文字幕久...| 日本一本在线免费福利| 狠狠久久亚洲欧美专区| 男女av免费观看| 欧美aaaaaa| 精品国产乱码久久久久久牛牛| 人妻丰满熟妇av无码久久洗澡| 国产成人短视频在线观看| 久久久成人av| 欧美一级视频免费观看| 青青草成人在线观看| 亚洲综合中文字幕在线观看| 午夜影院在线视频| 亚洲欧洲精品一区二区三区不卡| 亚洲国产精品无码av| 制服诱惑亚洲| 精品日韩av一区二区| av女人的天堂| 激情另类综合| 国产精品视频精品视频| 免费a级片在线观看| 国产欧美一区二区精品久导航| 一二三四中文字幕| 午夜激情成人网| 精品国产免费视频| 日本女人性生活视频| 日韩一级精品| 亚洲综合精品一区二区| 国产区视频在线| 亚洲网友自拍偷拍| 日本免费色视频| 欧美日韩爱爱| 欧美激情手机在线视频 | 日韩精品无码一区二区三区久久久| 91精品久久久久久久久久不卡| 日本久久久久久| 亚洲经典一区二区三区| 国产精品国产自产拍高清av王其| 久久精品视频16| 国内不卡的一区二区三区中文字幕| 日韩电影中文字幕一区| 国产探花在线播放| 久久电影国产免费久久电影| 久久综合伊人77777麻豆| 人人超在线公开视频| 欧美精品在线一区二区三区| a级大片在线观看| 亚洲青色在线| 成人自拍偷拍| 91精品久久久| 欧美另类z0zxhd电影| 我不卡一区二区| 久久福利精品| 久久人人97超碰人人澡爱香蕉| 欧美性猛片xxxxx免费中国| 欧美日本在线视频| 九九热免费在线| 久久综合九色综合欧美狠狠| 精品久久一区二区三区蜜桃| 欧美人与性动交α欧美精品济南到| 欧美精品少妇一区二区三区| 男人天堂资源网| 蜜臀91精品一区二区三区| 欧美激情www| 亚洲校园激情春色| 亚洲美女自拍视频| 久久国产视频一区| 91浏览器在线视频| 久久人妻精品白浆国产| 欧洲专线二区三区| 国产精品久久久久久久7电影| 青青草在线免费观看| 日韩欧美在线网址| 黑人巨大精品欧美| 天堂一区二区在线| 日产国产精品精品a∨| 日韩美女在线看免费观看| 在线成人中文字幕| 97成人在线观看| 亚洲精品乱码久久久久久久久| 老司机av网站| 亚洲青色在线| 欧美性高跟鞋xxxxhd| 欧美最猛黑人xxxx黑人猛叫黄| 六月婷婷综合网| 午夜a成v人精品| 中文字幕被公侵犯的漂亮人妻| 日韩激情一区二区| 永久免费精品视频网站| 欧美黄视频在线观看| 久久久久久久久久久人体| 五月天婷婷社区| 日本久久一区二区三区| 免费成人美女女在线观看| 国产一区二区三区四区五区美女| 精品视频在线观看一区二区| 激情小说亚洲图片| 国产精品av在线播放| 九七久久人人| 精品欧美乱码久久久久久1区2区| 国产成人无码精品久在线观看| 久久伊99综合婷婷久久伊| 三上悠亚在线一区二区| 欧美日韩在线大尺度| 欧美激情第六页| 国产精品国产亚洲精品| 992tv成人免费视频| 成人精品一区二区三区校园激情 | 欧美成人午夜激情| 蜜臀久久精品久久久久| 欧美伊人久久久久久久久影院 | 亚洲国产精品久久久天堂| 国产伦一区二区三区色一情| 日韩欧美少妇| 国产aⅴ综合色| 欧美另类在线观看| 性插视频在线观看| 欧美剧在线免费观看网站| 国产一级片免费观看| 中文幕一区二区三区久久蜜桃| 中国免费黄色片| 青青草伊人久久| 国产3p露脸普通话对白| 久久国产精品亚洲人一区二区三区 | 黄色小说综合网站| 男人日女人视频网站| 成人在线免费视频观看| 国产视频在线观看一区| 亚洲精品第一| 国产成人精彩在线视频九色| 丁香花在线电影| 精品国内自产拍在线观看| 欧洲毛片在线| 精品欧美乱码久久久久久1区2区| 亚洲天堂久久久久| 欧美视频免费在线观看| 妺妺窝人体色www婷婷| 中文字幕色av一区二区三区| 欧美做受高潮6| 91亚洲精品乱码久久久久久蜜桃 | 亚洲欧美在线免费观看| 亚洲精品国产suv一区| 欧美日韩一区二区三区视频| 欧美激情黑白配| 午夜精品成人在线视频| 国产大学生自拍| 自拍偷拍亚洲欧美日韩| 九九热久久免费视频| 久久精品一区二区| 蜜桃传媒一区二区亚洲av| 成人国产视频在线观看| 日本一二三四区视频| 久久国产夜色精品鲁鲁99| 无码日韩人妻精品久久蜜桃| 久久久久久久欧美精品| www黄色日本| 国产欧美69| 91成人在线观看喷潮教学| 日韩视频一区二区三区在线播放免费观看| 国产肉体ⅹxxx137大胆| 欧美激情精品久久久六区热门| 99热这里只有精品7| 7777久久香蕉成人影院| 在线一区亚洲| 亚洲成av人电影| 老司机午夜免费福利视频| 欧美大片专区| 色婷婷777777仙踪林| 欧美 日韩 国产一区二区在线视频| 中文字幕不卡每日更新1区2区| 久久网站免费观看| 亚洲欧美日韩精品综合在线观看 | 在线观看亚洲区| 成人好色电影| 日韩在线视频免费观看| 久操视频在线免费播放| 色综合五月天导航| 黄色大片在线| 91av在线国产| 电影久久久久久| 国产在线视频91| 高清国产一区二区三区四区五区| 3d动漫啪啪精品一区二区免费| 亚洲精选av| 久久精品午夜一区二区福利| 国产亚洲一卡2卡3卡4卡新区| 日韩电影大全在线观看| 91影院成人| 欧美日韩dvd| 亚洲精选在线| 日韩无套无码精品| 久久66热re国产| 五月天丁香社区| 久久人人爽人人爽| 男人晚上看的视频| 亚洲主播在线观看| 日韩人妻精品中文字幕| 欧美日韩亚洲丝袜制服| 国产sm主人调教女m视频| 日韩成人在线视频观看| 东凛在线观看| 九九热99久久久国产盗摄| 亚洲美女炮图| 国产一区二区色| 国产精品极品在线观看| 日韩精品欧美一区二区三区| 永久亚洲成a人片777777| 动漫av网站免费观看| 激情丁香综合五月| 中文字幕影片免费在线观看| 中文字幕欧美国产| 18精品爽视频在线观看| 欧美在线免费观看亚洲| 午夜免费福利视频| 国产香蕉一区二区三区在线视频 | 亚洲精品中文字幕乱码三区| 亚洲熟女综合色一区二区三区| 91精品欧美久久久久久动漫 | 欧美性潮喷xxxxx免费视频看| 久久精品网址| 中文字幕一二三| 国产欧美日韩一区二区三区在线观看| 欧美日韩人妻精品一区二区三区 | 欧美肥老妇视频| 日韩大尺度黄色| 国产精品免费在线| 99tv成人| 18岁视频在线观看| 成人三级伦理片| 国产性生活大片| 色婷婷一区二区三区四区| www.色呦呦| 日韩在线欧美在线国产在线| 欧美黄色网页| 国产精品嫩草在线观看| 亚洲网色网站| 在线观看免费黄网站| 91麻豆精东视频| 国产在线视频99| 56国语精品自产拍在线观看| 国产片在线观看| 18性欧美xxxⅹ性满足| 136国产福利精品导航网址应用| 一区二区不卡在线| 欧美a一区二区| 免费一级做a爰片久久毛片潮| 亚洲自拍欧美精品| av中文字幕在线免费观看| 日韩在线视频线视频免费网站| 456亚洲精品成人影院| 精品乱码一区| 日韩视频三区| 给我免费观看片在线电影的| 亚洲成a人片在线不卡一二三区 | 日本一区视频在线观看| 一区二区日韩免费看| 一边摸一边做爽的视频17国产| 亚洲美女免费视频| 国产熟女一区二区丰满| 久久亚洲春色中文字幕| 欧美另类激情| 久久免费视频2| 韩国成人福利片在线播放| 开心激情五月网| 69堂成人精品免费视频| 免费av毛片在线看| 91久久精品国产91久久| 天天射天天综合网| 欧美性受xxxx黒人xyx性爽| √…a在线天堂一区| 国产美女免费视频| 欧美精品在线免费观看| 亚洲成人影音| 精品少妇在线视频| 91首页免费视频| 在线免费观看av网址| 色青青草原桃花久久综合| 欧美一区=区三区| 国产日产欧美一区二区| 国内精品免费| 亚洲欧洲免费视频| 亚洲人体影院| 午夜一区二区三视频在线观看| 免费成人av资源网| 美女的奶胸大爽爽大片| 欧美精品一区二区高清在线观看| 嗯啊主人调教在线播放视频| 久久亚洲一区二区| 日韩福利电影在线观看| 人与动物性xxxx| 日韩一区二区免费在线电影| 丁香花在线影院| 日本一区视频在线| 国产一区二区三区香蕉 | 欧美日韩hd| 中文字幕av观看| 欧美日韩免费一区二区三区 | 91大神福利视频在线| 国产麻豆精品久久| 天天操狠狠操夜夜操| 亚洲国产wwwccc36天堂| 精华区一区二区三区| 成人有码在线视频| 亚洲美女毛片| 国产午夜精品福利视频| 欧美大片一区二区| 午夜精品久久久久久久久久蜜桃| 中文字幕人成一区| 不卡视频免费播放| 伊人成年综合网| 欧美国产日韩一区二区三区| 国产欧美久久一区二区三区| 久久精品无码一区二区三区毛片 | 在线观看中文字幕av| 欧美激情综合色|