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

動手探究Java內存泄露問題

譯文
開發 后端
在本系列教程中,將帶大家動手探究Java內存泄露之謎,并教授給讀者相關的分析方法。以下是一個案例。

在本系列教程中,將帶大家動手探究Java內存泄露之謎,并教授給讀者相關的分析方法。以下是一個案例。

最近有一個服務器,經常運行的時候就出現過載宕機的現象。重啟腳本和系統后,該個問題還是會出現。盡管有大量的數據丟失,但因不是關鍵業務,問題并不嚴重。不過還是決定作進一步的調查,來看下問題到底出現在哪。首先注意到的是,服務器通過了所有的單元測試和完整的集成環境的測試。在測試環境下使用測試數據時運行正常,那么為什么在生產環境中運行會出現問題呢?很容易會想到,也許是因為實際運行時的負載大于測試時的負載,甚至超過了設計的負荷,從而耗盡了資源。但是到底是什么資源,在哪里耗盡了呢?下面我們就研究這個問題

為了演示這個問題,首先要做的是編寫一些內存泄露的代碼,將使用生產-消費者模式去實現,以便更好說明問題。

例子中,假定有這樣一個場景:假設你為一個證劵經紀公司工作,這個公司將股票的銷售額和股份記錄在數據庫中。通過一個簡單進程獲取命令并將其存放在一個隊列中。另一個進程從該隊列中讀取命令并將其寫入數據庫。命令的POJO對象十分簡單,如下代碼所示:
 

  1. public class Order { 
  2.   
  3.   private final int id; 
  4.   
  5.   private final String code; 
  6.   
  7.   private final int amount; 
  8.   
  9.   private final double price; 
  10.   
  11.   private final long time; 
  12.   
  13.   private final long[] padding; 
  14.   
  15.   /** 
  16.    * @param id 
  17.    *            The order id 
  18.    * @param code 
  19.    *            The stock code 
  20.    * @param amount 
  21.    *            the number of shares 
  22.    * @param price 
  23.    *            the price of the share 
  24.    * @param time 
  25.    *            the transaction time 
  26.    */ 
  27.   public Order(int id, String code, int amount, double price, long time) { 
  28.     super(); 
  29.     this.id = id; 
  30.     this.code = code; 
  31.     this.amount = amount; 
  32.     this.price = price; 
  33.     this.time = time; 
  34.     
  35.     //這里故意設置Order對象足夠大,以方便例子稍后在運行的時候耗盡內存 
  36.     this.padding = new long[3000]; 
  37.     Arrays.fill(padding, 0, padding.length - 1, -2); 
  38.   } 
  39.   
  40.   public int getId() { 
  41.     return id; 
  42.   } 
  43.   
  44.   public String getCode() { 
  45.     return code; 
  46.   } 
  47.   
  48.   public int getAmount() { 
  49.     return amount; 
  50.   } 
  51.   
  52.   public double getPrice() { 
  53.     return price; 
  54.   } 
  55.   
  56.   public long getTime() { 
  57.     return time; 
  58.   } 
  59.   

這個POJO對象是Spring應用的一部分,該應用有三個主要的抽象類,當Spring調用它們的start()方法的時候將分別創建一個新的線程。

第一個抽象類是OrderFeed。run()方法將生成一系列隨機的Order對象,并將其放置在隊列中,然后它會睡眠一會兒,又再接著生成一個新的Order對象,代碼如下:

  1. public class OrderFeed implements Runnable { 
  2.  
  3.  private static Random rand = new Random(); 
  4.  
  5.  private static int id = 0
  6.  
  7.  private final BlockingQueue<Order> orderQueue; 
  8.  
  9.  public OrderFeed(BlockingQueue<Order> orderQueue) { 
  10.    this.orderQueue = orderQueue; 
  11.  } 
  12.  
  13.  /** 
  14.   *在加載Context上下文后由Spring調用,開始生產order對象 
  15.   */ 
  16.  public void start() { 
  17.  
  18.    Thread thread = new Thread(this"Order producer"); 
  19.    thread.start(); 
  20.  } 
  21.  
  22.   @Override 
  23.  public void run() { 
  24.  
  25.    while (true) { 
  26.      Order order = createOrder(); 
  27.      orderQueue.add(order); 
  28.      sleep(); 
  29.    } 
  30.  } 
  31.  
  32.  private Order createOrder() { 
  33.  
  34.    final String[] stocks = { "BLND.L""DGE.L""MKS.L""PSON.L""RIO.L""PRU.L"
  35.        "LSE.L""WMH.L" }; 
  36.    int next = rand.nextInt(stocks.length); 
  37.    long now = System.currentTimeMillis(); 
  38.  
  39.    Order order = new Order(++id, stocks[next], next * 100, next * 10, now); 
  40.    return order; 
  41.  } 
  42.  
  43.  private void sleep() { 
  44.    try { 
  45.      TimeUnit.MILLISECONDS.sleep(100); 
  46.    } catch (InterruptedException e) { 
  47.      e.printStackTrace(); 
  48.    } 
  49.  } 

#p#

第二個類是OrderRecord,這個類負責從隊列中提取Order對象,并將它們寫入數據庫。問題是,將Order對象寫入數據庫的耗時比產生Order對象的耗時要長得多。為了演示,將在recordOrder()方法中讓其睡眠1秒。

  1. public class OrderRecord implements Runnable { 
  2.  
  3.   private final BlockingQueue<Order> orderQueue; 
  4.  
  5.   public OrderRecord(BlockingQueue<Order> orderQueue) { 
  6.     this.orderQueue = orderQueue; 
  7.   } 
  8.  
  9.   public void start() { 
  10.  
  11.     Thread thread = new Thread(this"Order Recorder"); 
  12.     thread.start(); 
  13.   } 
  14.  
  15.   @Override 
  16.   public void run() { 
  17.  
  18.     while (true) { 
  19.  
  20.       try { 
  21.         Order order = orderQueue.take(); 
  22.         recordOrder(order); 
  23.       } catch (InterruptedException e) { 
  24.         e.printStackTrace(); 
  25.       } 
  26.     } 
  27.  
  28.   } 
  29.  
  30.   /** 
  31.    * 模擬記錄到數據庫的方法,這里只是簡單讓其睡眠一秒  
  32.    */ 
  33.   public void recordOrder(Order order) throws InterruptedException { 
  34.     TimeUnit.SECONDS.sleep(1); 
  35.   } 
  36.  

為了證明這個效果,特意增加了一個監視類 OrderQueueMonitor ,這個類每隔幾秒就打印出隊列的大小,代碼如下:

  1. public class OrderQueueMonitor implements Runnable { 
  2.  
  3.   private final BlockingQueue<Order> orderQueue; 
  4.  
  5.   public OrderQueueMonitor(BlockingQueue<Order> orderQueue) { 
  6.     this.orderQueue = orderQueue; 
  7.   } 
  8.  
  9.   public void start() { 
  10.  
  11.     Thread thread = new Thread(this"Order Queue Monitor"); 
  12.     thread.start(); 
  13.   } 
  14.  
  15.   @Override 
  16.   public void run() { 
  17.  
  18.     while (true) { 
  19.  
  20.       try { 
  21.         TimeUnit.SECONDS.sleep(2); 
  22.         int size = orderQueue.size(); 
  23.         System.out.println("Queue size is:" + size); 
  24.       } catch (InterruptedException e) { 
  25.         e.printStackTrace(); 
  26.       } 
  27.     } 
  28.   } 
  29.  

接下來配置Spring框架的相關配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3. xmlns:p="http://www.springframework.org/schema/p" 
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5. xmlns:context="http://www.springframework.org/schema/context" 
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd" 
  8. default-init-method="start" 
  9. default-destroy-method="destroy"
  10.   
  11. <bean id="theQueue" class="java.util.concurrent.LinkedBlockingQueue"/>  
  12. <bean id="orderProducer"
  13. <constructor-arg ref="theQueue"/> 
  14. </bean> 
  15.   
  16. <bean id="OrderRecorder"
  17. <constructor-arg ref="theQueue"/> 
  18. </bean> 
  19.   
  20. <bean id="QueueMonitor"
  21. <constructor-arg ref="theQueue"/> 
  22. </bean> 
  23.   
  24. </beans> 

接下來運行這個Spring應用,并且可以通過jConsole去監控應用的內存情況,這需要作一些配置,配置如下:

  1. -Dcom.sun.management.jmxremote  
  2. -Dcom.sun.management.jmxremote.port=9010  
  3. -Dcom.sun.management.jmxremote.local.only=false  
  4. -Dcom.sun.management.jmxremote.authenticate=false  
  5. -Dcom.sun.management.jmxremote.ssl=false 

如果你看看堆的使用量,你會發現隨著隊列的增大,堆的使用量逐漸增大,如下圖所示,你可能不會發現1KB的內存泄露,但當達到1GB的內存溢出就很明顯了。所以,接下來要做的事情就是等待其溢出,然后進行分析。

#p#

接下來我們來看下如何發現并解決這類問題。在Java中,可以借助不少自帶的或第三方的工具幫助我們進行相關的分析。

下面介紹分析程序內存泄露問題的三個步驟:

  1. 提取發生內存泄露的服務器的轉儲文件。
  2. 用這個轉儲文件生成報告。
  3. 分析生成的報告。

有幾個工具能幫你生成堆轉儲文件,分別是:

  • jconsole
  •  visualvm
  • Eclipse Memory Analyser Tool(MAT)

用jconsole提取堆轉儲文件

使用jconsole連接到你的應用:單擊MBeans選項卡打開com.sun.management包,點擊HotSpotDiagnostic,點擊Operations,然后選擇dumpHeap。這時你將會看到dumpHeap操作:它接受兩個參數p0和p1。在p0的編輯框內輸入一個堆轉儲的文件名,然后按下DumpHeap按鈕就可以了。如下圖:

用jvisualvm提取堆轉儲文件

首先使用jvisual vm連接示例代碼,然后右鍵點擊應用,在左側的“application”窗格中選擇“Heap Dump”。

注意:如果需要分析的發生內存泄露的是在遠程服務器上,那么jvisualvm將會把轉存出來的文件保存在遠程機器(假設這是一臺unix機器)上的/tmp目錄下。

用MAT來提取堆轉儲文件

jconsole和jvisualvm本身就是JDK的一部分,而MAT或被稱作“內存分析工具”,是一個基于eclipse的插件,可以從eclipse.org下載。

最新版本的MAT需要你在電腦上安裝JDk1.6。如果你用的是Java1.7版本也不用擔心,因為它會自動為你安裝1.6版本,并且不會和安裝好的1.7版本產生沖突。

使用MAT的時候,只需要點擊“Aquire Heap Dump”,然后按步驟操作就可以了,如下圖:

要注意的是,使用上面的三種方法,都需要配置遠程JMX連接如下:

  1. -Dcom.sun.management.jmxremote 
  2. -Dcom.sun.management.jmxremote.port=9010 
  3. -Dcom.sun.management.jmxremote.local.only=false 
  4. -Dcom.sun.management.jmxremote.authenticate=false 
  5. -Dcom.sun.management.jmxremote.ssl=false 

何時提取堆轉存文件

那么在什么時候才應該提取堆轉存文件呢?這需要耗費點心思和碰下運氣。如果過早提取了堆轉儲文件,那么將可能不能發現問題癥結所在,因為它們被合法,非泄露類的實例屏蔽了。不過也不能等太久,因為提取堆轉儲文件也需要占用內存,進行提取的時候可能會導致應用崩潰。

最好的辦法是將jconsole連接到應用程序并監控堆的占用情況,知道它何時在崩潰的邊緣。因為沒有發生內存泄露時,三個堆部分指標都是綠色的,這樣很容易就能監控到,如下圖:

分析轉儲文件

現在輪到MAT派上用場了,因為它本身就是設計用來分析堆轉儲文件的。要打開和分析一個堆轉儲文件,可以選擇File菜單的Heap Dump選項。選擇了要打開的文件后,將會看到如下三個選項:

#p#

選擇Leak Suspect Report選項。在MAT運行幾秒后,會生成如下圖的頁面:

如餅狀圖顯示:疑似有一處發生了內存泄露。也許你會想,這樣的做法只有在代碼受到控制的情況下才可取。畢竟這只是個例子,這又能說明什么呢?好吧,在這個例子里,所有的問題都是淺然易見的;線程a占用了98.7MB內存,其他線程用了1.5MB。在實際情況中,得到的圖表可能是上圖那樣。讓我們繼續探究,會得到如下圖:

如上圖所示,報告的下一部分告訴我們,有一個LinkedBlockQueue占用了98.46%的內存。想要進一步的探究,點擊Details>>就可以了,如下圖:

可以看到,問題確實是出在我們的orderQueue上。這個隊列里存儲了所有生成的隨機生成的Order對象,并且可以被我們上篇博文里提到的三個線程OrderFeed、OrderRecord、OrderMonitor訪問。

那么一切都清楚了,MAT告訴我們:示例代碼中有一個LinkedBlockQueue,這個隊列用盡了所有的內存,從而導致了嚴重的問題。不過我們不知道這個問題為什么會產生,也不能指望MAT告訴我們。

本文代碼可以在:https://github.com/roghughe/captaindebug/tree/master/producer-consumer中下載。

原文鏈接:http://www.javacodegeeks.com/2013/12/investigating-memory-leaks-part-1-writing-leaky-code.html

責任編輯:陳四芳 來源: 51CTO
相關推薦

2010-05-31 16:53:21

Java

2024-10-31 09:24:42

2020-06-23 09:48:09

Python開發內存

2025-10-15 00:26:20

2010-09-25 11:32:24

Java內存泄漏

2025-01-08 08:47:44

Node.js內存泄露定時器

2023-06-30 23:25:46

HTTP模塊內存

2013-04-09 14:49:18

Linux內存統計內存泄露

2009-06-16 11:11:07

Java內存管理Java內存泄漏

2015-05-20 16:04:22

Chrome

2010-09-17 16:18:43

Java內存溢出

2015-05-14 15:38:40

javajava內存泄露

2011-11-17 13:59:41

Java內存管理內存泄露

2015-12-07 09:39:27

Java內存泄露

2012-04-11 13:46:33

ibmdw

2017-12-11 11:00:27

內存泄露判斷

2010-09-25 11:23:15

Java內存泄露

2019-04-04 13:11:37

React內存泄露memory leak

2011-06-22 13:47:16

Java多線程

2011-06-22 13:57:54

Java多線程
點贊
收藏

51CTO技術棧公眾號

亚洲日本青草视频在线怡红院| 欧美freesex交免费视频| 欧美三级欧美成人高清www| 欧美裸体网站| 国产一区二区视频免费观看| 亚洲91精品| 亚洲精品成人久久| 中文字幕天天干| 免费影视亚洲| 国产亚洲欧美一区在线观看| 成人性生交大片免费观看嘿嘿视频| 欧美极品视频在线观看| 少妇精品久久久一区二区| 欧美丰满少妇xxxbbb| www.99热这里只有精品| 午夜免费播放观看在线视频| 成人高清视频免费观看| 国产精品一区二区三区久久| 国产在线精品观看| 婷婷丁香综合| 亚洲人成电影在线| 无码人妻一区二区三区一| 天天免费亚洲黑人免费| 亚洲精品一卡二卡| 蜜桃传媒视频第一区入口在线看| 国产又黄又粗又硬| 美女久久一区| 久久久久国产一区二区三区| 美女av免费看| 亚洲精品国产setv| 精品精品国产高清一毛片一天堂| 亚洲最大成人在线观看| 亚洲天堂av在线| 夜夜操天天操亚洲| 亚洲日本一区二区三区在线不卡| 视频一区二区三区在线看免费看| 丁香婷婷综合激情五月色| 国产乱人伦真实精品视频| 麻豆精品久久久久久久99蜜桃| 欧美精品九九| 久久亚洲精品成人| 99精品中文字幕| 欧洲杯半决赛直播| 亚洲性猛交xxxxwww| 男生裸体视频网站| 麻豆精品少妇| 亚洲国产精品久久久久| 亚洲成人av免费观看| 欧美aaa级| 欧美日韩精品福利| av免费网站观看| 日本不卡一二三| 色狠狠综合天天综合综合| 男人操女人免费软件| 2021天堂中文幕一二区在线观| 亚洲男人天堂av| 二级片在线观看| 国产在线观看a视频| 亚洲三级电影全部在线观看高清| 在线一区高清| 在线免费观看a视频| 亚洲人成小说网站色在线| 性做爰过程免费播放| 欧美jizzhd69巨大| 亚洲精品一二三| 欧美精品久久久久久久自慰| h片在线观看| 精品动漫一区二区三区| 久久久久久久久久久视频| 亚洲欧洲自拍| 欧美私模裸体表演在线观看| 国产精品视频中文字幕| 国产精一区二区| 日韩一二三区视频| 国产精品久久久久久久无码| 日韩欧美ww| 一区二区三区动漫| 一区二区三区影视| 精品动漫一区| 国产第一区电影| 国产精品一级二级| 成人在线视频一区二区| 欧美lavv| 免费在线视频欧美| 亚洲成a人v欧美综合天堂下载| ww国产内射精品后入国产| 国模一区二区| 日韩午夜激情av| 白丝女仆被免费网站| 日韩精品一卡| 久久人人看视频| 伊人久久久久久久久久久久 | 欧美大片大片在线播放| 国产在线欧美在线| 日韩在线卡一卡二| 亚洲一区二区三区sesese| 天堂网av在线播放| 国产人伦精品一区二区| 日韩不卡一二区| 巨茎人妖videos另类| 制服丝袜在线91| 国产香蕉精品视频| 成人情趣视频网站| 高清视频欧美一级| 自拍偷拍第八页| 风流少妇一区二区| 亚洲春色在线| 不卡专区在线| 欧美一区在线视频| 人妻一区二区视频| 禁久久精品乱码| 成人a视频在线观看| 在线观看xxx| 亚洲欧美日韩久久| www.色就是色| 群体交乱之放荡娇妻一区二区 | 美足av综合网| 欧美三级韩国三级日本三斤| 波多野结衣加勒比| 中文字幕一区二区三区久久网站| 日本精品免费一区二区三区| 午夜精品久久久久久久99| 国产亚洲午夜高清国产拍精品 | 精品国产123| 日本精品在线免费观看| 视频一区视频二区在线观看| 国产一区二区免费在线观看| a视频在线观看| 欧美日韩国产一级二级| 亚洲精品午夜视频| 国产日韩精品视频一区二区三区 | 日韩国产综合| 日本老师69xxx| 天堂av在线7| 亚洲国产你懂的| 伊人av在线播放| 永久91嫩草亚洲精品人人| 国产精品入口尤物| 国产黄色在线| 在线视频国内自拍亚洲视频| 亚洲一区二区三区综合| 黄色精品一区| 国产精品一区二区三区免费| 成人免费视屏| 91精品国产综合久久久久久漫画 | 国产成人精品亚洲精品| 天堂网在线播放| 精品国产91乱高清在线观看 | 91免费看`日韩一区二区| 人人妻人人澡人人爽欧美一区双 | 91插插插插插插| 寂寞少妇一区二区三区| 中文字幕一区二区三区有限公司| 丁香久久综合| 日韩一区av在线| 国产精品高潮呻吟久久久| 国产精品理伦片| 亚洲精品性视频| 999视频精品| 91亚洲精品一区二区| www国产在线观看| 日韩久久久精品| 国产一级二级三级| 成人黄页毛片网站| a级黄色一级片| 九九久久精品| 国产精品wwww| 欧美天天影院| 日韩一区二区在线免费观看| 欧美三级小视频| 成人国产一区二区三区精品| 国产h视频在线播放| 亚洲综合福利| 国产日韩专区在线| 曰本三级在线| 精品亚洲夜色av98在线观看| 中文字幕在线观看欧美| 亚洲欧美日韩一区二区三区在线观看| 免费看91视频| 免费精品视频| 欧美 另类 交| 噜噜噜天天躁狠狠躁夜夜精品| 日韩美女免费视频| 黄网站在线播放| 亚洲国产欧美精品| 中文字幕 国产| 一区二区三区日韩欧美| 成人影视免费观看| 紧缚奴在线一区二区三区| 国产91沈先生在线播放| 久久91麻豆精品一区| 91亚洲国产成人精品性色| 91精品国产黑色瑜伽裤| 一区二区在线视频| 亚洲乱色熟女一区二区三区| 欧美日韩中文在线| 五月天色婷婷丁香| 91免费视频观看| 精品人妻一区二区三区免费| 久久av最新网址| 欧美 国产 精品| 九九热精品视频在线观看| 亚洲va电影大全| 桃色一区二区| 欧美精品videosex性欧美| 久久久久久久久久亚洲| 日韩大片b站免费观看直播| 欧美日韩国产bt| 日本三级午夜理伦三级三| 激情伊人五月天久久综合| www.国产亚洲| 日韩久久综合| 麻豆av一区二区| 国产日韩三级| av影院午夜一区| 一区二区三区入口| 99热这里只有精品8| 亚洲午夜激情| 偷拍亚洲色图| 国产精品免费一区二区三区| 素人一区二区三区| 51ⅴ精品国产91久久久久久| 无码人妻少妇伦在线电影| 性欧美1819sex性高清| 久久天堂电影网| 国产高清视频在线观看| 国产精品一二三区在线| 日本一区高清在线视频| 日本肉肉一区| 97色在线观看| 佐山爱在线视频| 久久精品免视看国产成人| 日本sm极度另类视频| 黄av在线免费观看| 日韩在线视频观看| 成人免费高清在线播放| 日韩精品在线免费播放| 秋霞欧美在线观看| 亚洲高清av在线| 日韩 国产 欧美| 免费高清成人在线| 欧美牲交a欧美牲交aⅴ免费真 | 久久爱av电影| 国产色噜噜噜91在线精品| 99r国产精品视频| 久久久久久亚洲精品美女| 国产欧洲精品视频| 日韩伦理一区二区| 亚洲天堂福利av| 青青青视频在线播放| 欧美韩国日本不卡| 午夜影院黄色片| 中文字幕乱码久久午夜不卡 | 亚洲综合一区二区三区| 久久国产在线观看| 亚洲国产视频a| 日本免费一二三区| 欧美日韩免费看| 免费视频久久久| 91国产丝袜在线播放| 蜜臀尤物一区二区三区直播| 欧美在线影院一区二区| 中文字幕在线网站| 欧美一区午夜视频在线观看| a级片在线免费看| 亚洲的天堂在线中文字幕| 亚洲AV第二区国产精品| 亚洲无限av看| 免费a级人成a大片在线观看| 美日韩精品免费视频| 1区2区在线观看| 国色天香2019中文字幕在线观看| 特黄毛片在线观看| 国产精品十八以下禁看| 国产精品久久久久久av公交车| 97久久天天综合色天天综合色hd| 黄色成人美女网站| 日本免费高清一区| 亚洲女同另类| 亚洲中文字幕无码专区| 日韩av二区在线播放| 99视频在线观看视频| 成人精品一区二区三区四区| 熟女俱乐部一区二区| 中文字幕亚洲精品在线观看| 麻豆一区二区三区精品视频| 色偷偷久久人人79超碰人人澡| 伊人亚洲综合网| 欧美成人性战久久| 高清美女视频一区| 欧美激情久久久| 在线观看精品| 成人欧美一区二区三区视频xxx | 91p九色成人| 91九色对白| 欧美精品一区二区久久| www国产免费| 久久综合影视| ass极品水嫩小美女ass| 91在线视频播放地址| 亚洲一级理论片| 婷婷综合久久一区二区三区| 在线观看中文字幕码| 亚洲精品720p| mm1313亚洲国产精品美女| 欧美专区在线播放| 一区二区三区在线资源| 手机在线观看国产精品| 亚洲激情自拍| av在线网站免费观看| 久久久久久97三级| 麻豆91精品91久久久| 欧美性色aⅴ视频一区日韩精品| 亚洲av无码乱码国产精品久久| 在线观看视频99| 手机在线观看av网站| 3d蒂法精品啪啪一区二区免费| 国产欧美日韩精品一区二区三区 | 免费成人直播| 国产精品手机视频| 亚洲精品2区| 一本岛在线视频| 欧美激情在线免费观看| 青青青国产在线 | 91亚洲精品一区| 色婷婷色综合| 亚洲色图久久久| 久久精品人人做人人爽人人| 日韩精品人妻中文字幕| 欧美一二三区精品| sm国产在线调教视频| 国产一区二中文字幕在线看 | 99麻豆久久久国产精品免费 | 99综合视频| 成人欧美精品一区二区| 亚洲蜜臀av乱码久久精品蜜桃| 羞羞色院91蜜桃| 国产一区二区三区网站| 小黄鸭精品aⅴ导航网站入口| 九色91国产| 亚洲尤物在线| 中文精品在线观看| 一本大道久久a久久精品综合| 视频一区二区在线播放| 欧美有码在线视频| 美女网站一区| 国产一级片黄色| 中文字幕乱码日本亚洲一区二区 | 久久久综合久久| 欧美zozozo| av日韩国产| 精品卡一卡二| 丝袜美腿亚洲综合| 一级肉体全黄裸片| 欧美日韩一级二级| 毛片网站在线免费观看| 亚洲在线免费看| 亚洲视频久久| 三级黄色片网站| 色老综合老女人久久久| 91免费在线| 91精品国产综合久久香蕉| 牛夜精品久久久久久久99黑人| 国产老头和老头xxxx×| 亚洲国产三级在线| 免费人成在线观看网站| 国产精品一区二区性色av| 亚洲激情中文| xxxx黄色片| 在线一区二区三区做爰视频网站| 99中文字幕一区| 亚洲自拍小视频免费观看| 亚洲精品少妇| 人与嘼交av免费| 日韩午夜激情视频| 天堂在线中文网官网| 亚洲精品成人久久久998| 国产一区二区在线影院| 日本一区二区免费在线观看| 国产亚洲免费的视频看| 欧美a在线观看| 少妇高潮毛片色欲ava片| 国产日产精品一区| 国产麻豆91视频| 456国产精品| 成人午夜国产| 大桥未久恸哭の女教师| 欧洲人成人精品| 三级网站视频在在线播放| 美女被啪啪一区二区| 韩国午夜理伦三级不卡影院| 日韩免费一二三区| 丝袜亚洲欧美日韩综合| 91蝌蚪精品视频| 欧美激情第3页| 欧美日韩人人澡狠狠躁视频| 日本综合在线| 九九九久久久| 粉嫩在线一区二区三区视频| 精品一区二区无码|