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

重新認識 Java 中的內存映射(Mmap)

開發 后端 存儲軟件
mmap 是一種內存映射文件的方法,即將一個文件映射到進程的地址空間,實現文件磁盤地址和一段進程虛擬地址的映射。

[[434443]]

mmap 基礎概念

mmap 是一種內存映射文件的方法,即將一個文件映射到進程的地址空間,實現文件磁盤地址和一段進程虛擬地址的映射。實現這樣的映射關系后,進程就可以采用指針的方式讀寫操作這一段內存,而系統會自動回寫臟頁到對應的文件磁盤上,即完成了對文件的操作而不必再調用 read,write 等系統調用函數。相反,內核空間對這段區域的修改也直接反映用戶空間,從而可以實現不同進程間的文件共享。

mmap工作原理

操作系統提供了這么一系列 mmap 的配套函數。

  1. void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); 
  2. int munmap( void * addr, size_t len); 
  3. int msync( void *addr, size_t len, int flags); 

Java 中的 mmap

Java 中原生讀寫方式大概可以被分為三種:普通 IO,FileChannel(文件通道),mmap(內存映射)。區分他們也很簡單,例如 FileWriter,FileReader 存在于 java.io 包中,他們屬于普通 IO;FileChannel 存在于 java.nio 包中,也是 Java 最常用的文件操作類;而今天的主角 mmap,則是由 FileChannel 調用 map 方法衍生出來的一種特殊讀寫文件的方式,被稱之為內存映射。

mmap 的使用方式:

  1. FileChannel fileChannel = new RandomAccessFile(new File("db.data"), "rw").getChannel(); 
  2. MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, filechannel.size(); 

MappedByteBuffer 便是 Java 中的 mmap 操作類。

  1. // 寫 
  2. byte[] data = new byte[4]; 
  3. int position = 8; 
  4. // 從當前 mmap 指針的位置寫入 4b 的數據 
  5. mappedByteBuffer.put(data); 
  6. // 指定 position 寫入 4b 的數據 
  7. MappedByteBuffer subBuffer = mappedByteBuffer.slice(); 
  8. subBuffer.position(position); 
  9. subBuffer.put(data); 
  10.  
  11. // 讀 
  12. byte[] data = new byte[4]; 
  13. int position = 8; 
  14. // 從當前 mmap 指針的位置讀取 4b 的數據 
  15. mappedByteBuffer.get(data); 
  16. // 指定 position 讀取 4b 的數據 
  17. MappedByteBuffer subBuffer = mappedByteBuffer.slice(); 
  18. subBuffer.position(position); 
  19. subBuffer.get(data); 

mmap 不是銀彈

促使我寫這一篇文章的一大動力,來自于網絡中很多關于 mmap 錯誤的認知。初識 mmap,很多文章提到 mmap 適用于處理大文件的場景,現在回過頭看,其實這種觀點是非常荒唐的,希望通過此文能夠澄清 mmap 本來的面貌。

FileChannel 與 mmap 同時存在,大概率說明兩者都有其合適的使用場景,而事實也的確如此。在看待二者時,可以將其看待成實現文件 IO 的兩種工具,工具本身沒有好壞,主要還是看使用場景。

mmap vs FileChannel

這一節,詳細介紹一下 FileChannel 和 mmap 在進行文件 IO 的一些異同點。

pageCache

FileChannel 和 mmap 的讀寫都經過 pageCache,或者更準確的說法是通過 vmstat 觀測到的 cache 這一部分內存,而非用戶空間的內存。

  1. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 
  2.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 
  3.  3  0      0 4622324  40736 351384    0    0     0     0 2503  200 50  1 50  0  0 

至于說 mmap 映射的這部分內存能不能稱之為 pageCache,我并沒有去調研過,不過在操作系統看來,他們并沒有太多的區別,這部分 cache 都是內核在控制。后面本文也統一稱 mmap 出來的內存為 pageCache。

缺頁中斷

對 Linux 文件 IO 有基礎認識的讀者,可能對缺頁中斷這個概念也不會太陌生。mmap 和 FileChannel 都以缺頁中斷的方式,進行文件讀寫。

以 mmap 讀取 1G 文件為例, fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, _GB); 進行映射是一個消耗極少的操作,此時并不意味著 1G 的文件被讀進了 pageCache。只有通過以下方式,才能夠確保文件被讀進 pageCache。

  1. FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel(); 
  2. MappedByteBuffer map = fileChannel.map(MapMode.READ_WRITE, 0, _GB); 
  3. for (int i = 0; i < _GB; i += _4kb) { 
  4.  temp += map.get(i); 

關于內存對齊的細節在這里就不拓展了,可以詳見 java.nio.MappedByteBuffer#load 方法,load 方法也是通過按頁訪問的方式觸發中斷

如下是 pageCache 逐漸增長的過程,共計約增長了 1.034G,說明文件內容此刻已全部 load。

  1. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 
  2.  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 
  3.  2  0      0 4824640   1056 207912    0    0     0     0 2374  195 50  0 50  0  0 
  4.  2  1      0 4605300   2676 411892    0    0 205256     0 3481 1759 52  2 34 12  0 
  5.  2  1      0 4432560   2676 584308    0    0 172032     0 2655  346 50  1 25 24  0 
  6.  2  1      0 4255080   2684 761104    0    0 176400     0 2754  380 50  1 19 29  0 
  7.  2  3      0 4086528   2688 929420    0    0 167940    40 2699  327 50  1 25 24  0 
  8.  2  2      0 3909232   2692 1106300    0    0 176520     4 2810  377 50  1 23 26  0 
  9.  2  2      0 3736432   2692 1278856    0    0 172172     0 2980  361 50  1 17 31  0 
  10.  3  0      0 3722064   2840 1292776    0    0 14036     0 2757  392 50  1 29 21  0 
  11.  2  0      0 3721784   2840 1292892    0    0   116     0 2621  283 50  1 50  0  0 
  12.  2  0      0 3721996   2840 1292892    0    0     0     0 2478  237 50  0 50  0  0 

兩個細節:

mmap 映射的過程可以理解為一個懶加載, 只有 get() 時才會觸發缺頁中斷

預讀大小是有操作系統算法決定的,可以默認當作 4kb,即如果希望懶加載變成實時加載,需要按照 step=4kb 進行一次遍歷

而 FileChannel 缺頁中斷的原理也與之相同,都需要借助 PageCache 做一層跳板,完成文件的讀寫。

內存拷貝次數

很多言論認為 mmap 相比 FileChannel 少一次復制,我個人覺得還是需要區分場景。

例如需求是從文件首地址讀取一個 int,兩者所經過的鏈路其實是一致的:SSD -> pageCache -> 應用內存,mmap 并不會少拷貝一次。

但如果需求是維護一個 100M 的復用 buffer,且涉及到文件 IO,mmap 直接就可以當做是 100M 的 buffer 來用,而不用在進程的內存(用戶空間)中再維護一個 100M 的緩沖。

用戶態與內核態

用戶態和內核態

操作系統出于安全考慮,將一些底層的能力進行了封裝,提供了系統調用(system call)給用戶使用。這里就涉及到“用戶態”和“內核態”的切換問題,私認為這里也是很多人概念理解模糊的重災區,我在此梳理下個人的認知,如有錯誤也歡迎指正。

先看 FileChannel,下面兩段代碼,你認為誰更快?

  1. // 方法一: 4kb 刷盤 
  2. FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel(); 
  3. ByteBuffer byteBuffer = ByteBuffer.allocateDirect(_4kb); 
  4. for (int i = 0; i < _4kb; i++) { 
  5.     byteBuffer.put((byte)0); 
  6. for (int i = 0; i < _GB; i += _4kb) { 
  7.     byteBuffer.position(0); 
  8.     byteBuffer.limit(_4kb); 
  9.     fileChannel.write(byteBuffer); 
  10.  
  11. // 方法二: 單字節刷盤 
  12. FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel(); 
  13. ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1); 
  14. byteBuffer.put((byte)0); 
  15. for (int i = 0; i < _GB; i ++) { 
  16.     byteBuffer.position(0); 
  17.     byteBuffer.limit(1); 
  18.     fileChannel.write(byteBuffer); 

使用方法一:4kb 緩沖刷盤(常規操作),在我的測試機器上只需要 1.2s 就寫完了 1G。而不使用任何緩沖的方法二,幾乎是直接卡死,文件增長速度非常緩慢,在等待了 5 分鐘還沒寫完后,中斷了測試。

使用寫入緩沖區是一個非常經典的優化技巧,用戶只需要設置 4kb 整數倍的寫入緩沖區,聚合小數據的寫入,就可以使得數據從 pageCache 刷盤時,盡可能是 4kb 的整數倍,避免寫入放大問題。但這不是這一節的重點,大家有沒有想過,pageCache 其實本身也是一層緩沖,實際寫入 1byte 并不是同步刷盤的,相當于寫入了內存,pageCache 刷盤由操作系統自己決策。那為什么方法二這么慢呢?主要就在于 filechannel 的 read/write 底層相關聯的系統調用,是需要切換內核態和用戶態的,注意,這里跟內存拷貝沒有任何關系,導致態切換的根本原因是 read/write 關聯的系統調用本身。方法二比方法一多切換了 4096 倍,態的切換成為了瓶頸,導致耗時嚴重。

階段總結一下重點,在 DRAM 中設置用戶寫入緩沖區這一行為有兩個意義:

方便做 4kb 對齊,ssd 刷盤友好

減少用戶態和內核態的切換次數,cpu 友好

但 mmap 不同,其底層提供的映射能力不涉及到切換內核態和用戶態,注意,這里跟內存拷貝還是沒有任何關系,導致態不發生切換的根本原因是 mmap 關聯的系統調用本身。驗證這一點,也非常容易,我們使用 mmap 實現方法二來看看速度如何:

  1. FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel(); 
  2. MappedByteBuffer map = fileChannel.map(MapMode.READ_WRITE, 0, _GB); 
  3. for (int i = 0; i < _GB; i++) { 
  4.   map.put((byte)0); 

在我的測試機器上,花費了 3s,它比 FileChannel + 4kb 緩沖寫要慢,但遠比 FileChannel 寫單字節快。

這里也解釋了我之前文章《文件 IO 操作的一些最佳實踐》中一個疑問:"一次寫入很小量數據的場景使用 mmap 會比 fileChannel 快的多“,其背后的原理就和上述例子一樣,在小數據量下,瓶頸不在于 IO,而在于用戶態和內核態的切換。

mmap 細節補充

copy on write 模式

我們注意到 public abstract MappedByteBuffer map(MapMode mode,long position, long size) 的第一個參數,MapMode 其實有三個值,在網絡沖浪的時候,也幾乎沒有找到講解 MapMode 的文章。MapMode 有三個枚舉值 READ_WRITE、READ_ONLY、PRIVATE,大多數時候使用的可能是 READ_WRITE,而 READ_ONLY 不過是限制了 WRITE 而已,很容易理解,但這個 PRIVATE 身上似乎有一層神秘的面紗。

實際上 PRIVATE 模式正是 mmap 的 copy on write 模式,當使用 MapMode.PRIVATE 去映射文件時,你會獲得以下的特性:

其他任何方式對文件的修改,會直接反映在當前 mmap 映射中。

private mmap 之后自身的 put 行為,會觸發復制,形成自己的副本,任何修改不會會刷到文件中,也不再感知該文件該頁的改動。

俗稱:copy on write。

這有什么用呢?重點就在于任何修改都不會回刷文件。其一,你可以獲得一個文件副本,如果你正好有這個需求,直接可以使用 PRIVATE 模式去進行映射,其二,令人有點小激動的場景,你獲得了一塊真正的 PageCache,不用擔心它會被操作系統刷盤造成 overhead。假設你的機器配置如下:機器內存 9G,JVM 參數設置為 6G,堆外限制為 2G,那剩下的 1G 只能被內核態使用,如果想被用戶態的程序利用起來,就可以使用 mmap 的 copy on write 模式,這不會占用你的堆內內存或者堆外內存。

回收 mmap 內存

更正之前博文關于 mmap 內存回收的一個錯誤說法,回收 mmap 很簡單

  1. ((DirectBuffer) mmap).cleaner().clean(); 

mmap 的生命中簡單可以分為:map(映射),get/load (缺頁中斷),clean(回收)。一個實用的技巧是動態分配的內存映射區域,在讀取過后,可以異步回收掉。

mmap 使用場景

使用 mmap 處理小數據的頻繁讀寫

如果 IO 非常頻繁,數據卻非常小,推薦使用 mmap,以避免 FileChannel 導致的切態問題。例如索引文件的追加寫。

mmap 緩存

當使用 FileChannel 進行文件讀寫時,往往需要一塊寫入緩存以達到聚合的目的,最常使用的是堆內/堆外內存,但他們都有一個問題,即當進程掛掉后,堆內/堆外內存會立刻丟失,這一部分沒有落盤的數據也就丟了。而使用 mmap 作為緩存,會直接存儲在 pageCache 中,不會導致數據丟失,盡管這只能規避進程被 kill 這種情況,無法規避掉電。

小文件的讀寫

恰恰和網傳的很多言論相反,mmap 由于其不切態的特性,特別適合順序讀寫,但由于 sun.nio.ch.FileChannelImpl#map(MapMode mode, long position, long size) 中 size 的限制,只能傳遞一個 int 值,所以,單次 map 單個文件的長度不能超過 2G,如果將 2G 作為文件大 or 小的閾值,那么小于 2G 的文件使用 mmap 來讀寫一般來說是有優勢的。在 RocketMQ 中也利用了這一點,為了能夠方便的使用 mmap,將 commitLog 的大小按照 1G 來進行切分。對的,忘記說了,RocketMQ 等消息隊列一直在使用 mmap。

cpu 緊俏下的讀寫

在大多數場景下,FileChannel 和讀寫緩沖的組合相比 mmap 要占據優勢,或者說不分伯仲,但在 cpu 緊俏下的讀寫,使用 mmap 進行讀寫往往能起到優化的效果,它的根據是 mmap 不會出現用戶態和內核態的切換,導致 cpu 的不堪重負(但這樣承擔起動態映射與異步回收內存的開銷)。

特殊軟硬件因素

例如持久化內存 Pmem、不同代數的 SSD、不同主頻的 CPU、不同核數的 CPU、不同的文件系統、文件系統的掛載方式...等等因素都會影響 mmap 和 filechannel read/write 的快慢,因為他們對應的系統調用是不同的。只有 benchmark 過后,方知快慢。

 

責任編輯:武曉燕 來源: Kirito的技術分享
相關推薦

2014-01-06 11:23:54

Mesos設計架構

2016-12-13 15:41:40

JavaHashMap

2021-04-22 21:15:38

Generator函數生成器

2019-10-31 13:40:52

JavaPHP編程語言

2019-02-24 21:27:26

物聯網網關物聯網IOT

2016-11-07 11:34:28

數據可視化大數據

2023-03-01 10:37:51

2017-01-03 17:22:16

公共云安全

2020-09-17 07:08:04

TypescriptVue3前端

2019-09-02 08:53:46

程序員

2015-03-19 10:15:54

程序員價值程序員價值

2012-01-11 09:12:25

程序員

2009-11-26 16:57:09

Cisco路由器ARP

2012-06-26 11:11:44

架構師

2010-02-25 09:57:35

2011-04-25 17:15:39

MongodbMMAP

2023-05-03 09:09:28

Golang數組

2014-06-16 10:02:42

SwiftiOSWWDC

2018-08-20 16:25:48

編程語言Java異常處理

2022-10-09 11:46:55

機器人人工智能
點贊
收藏

51CTO技術棧公眾號

亚洲另类中文字| 黑人久久a级毛片免费观看| 99精品黄色片免费大全| 久久噜噜噜精品国产亚洲综合| 自拍视频第一页| 精品丝袜在线| 国产精品你懂的在线| 91麻豆国产精品| 日韩 欧美 综合| 日韩免费特黄一二三区| 日韩美女在线视频| 狠狠爱免费视频| 黄视频网站在线看| 成人动漫中文字幕| 国产精品久久一| 久久国产一级片| 欧美视频免费| 精品第一国产综合精品aⅴ| 91看片就是不一样| 最新日本在线观看| 久久久国产一区二区三区四区小说| 国产欧美久久一区二区| 日本免费在线播放| 91亚洲国产成人久久精品| 亚洲成人久久一区| 亚洲综合激情视频| 中国字幕a在线看韩国电影| 国产精品乱码久久久久久| 国产一区二区免费电影| 国产又粗又长视频| 亚洲精一区二区三区| 色系列之999| 国内精品免费视频| 中文字幕日本一区| 91成人国产精品| 很污的网站在线观看| 日本免费在线视频| 国产亚洲成aⅴ人片在线观看| 99久久99久久精品国产片| 一级特黄免费视频| 午夜在线精品偷拍| 久久久久久国产精品久久| 国产又黄又粗又猛又爽的| 欧美美女在线观看| 日韩成人av在线播放| 制服.丝袜.亚洲.中文.综合懂| 亚洲精品一区二区在线播放∴| 色婷婷精品久久二区二区蜜臂av| 黄色一级在线视频| 免费在线国产视频| 一区二区三区日韩精品视频| 亚洲精品一区二区三区四区五区| 青青久在线视频| 99精品国产视频| 国产精品yjizz| 精品人妻无码一区二区三区蜜桃一| 精品一区二区在线看| 国产精品美女999| 加勒比在线一区| 玖玖精品视频| 国产精品久久久久一区二区 | 在线观看国产小视频| 欧美专区在线| 日韩av观看网址| 性色av免费观看| 日韩精品视频网| 国产成人一区二区三区小说 | 性国产高清在线观看| 亚洲三级在线观看| 久久www视频| 国产三级伦理在线| 精品久久久久久久久中文字幕| 精品无码一区二区三区在线| 国产美女高潮在线观看| 欧美三级欧美成人高清www| 国产精品无码人妻一区二区在线 | 热门国产精品亚洲第一区在线| 成人毛片18女人毛片| 乱码第一页成人| 国产精品免费一区| 国产毛片一区二区三区va在线| 国产精品资源在线看| 国产 高清 精品 在线 a| 亚洲av无码乱码在线观看性色| 成人精品小蝌蚪| 日韩av在线一区二区三区| 国产小视频福利在线| 亚洲欧洲成人自拍| 日韩精品一区二区在线视频 | 日韩欧美字幕| 欧美成年人在线观看| 国产在线视频卡一卡二| 国产精品人人爽人人做我的可爱| 国产精品aaaa| 国产理论片在线观看| 国产成人免费在线观看| 久久99精品国产99久久| 91在线导航| 一区二区三区欧美亚洲| 欧美日韩亚洲一| 欧洲精品久久久久毛片完整版| 欧美精品一区二区三区视频| 中文字幕网站在线观看| 亚洲欧美综合久久久| 91精品国产91久久久久久不卡| 欧美日韩 一区二区三区| 国产乱子伦视频一区二区三区| 久久一区二区精品| 黄黄的网站在线观看| 天天综合网 天天综合色| 超碰在线公开97| 成人春色在线观看免费网站| 亚洲亚裔videos黑人hd| 国产亚洲色婷婷久久99精品| 国产亚洲精品v| 91最新在线免费观看| 免费a级毛片在线观看| 亚洲乱码国产乱码精品精可以看| 日日摸天天爽天天爽视频| 欧美久久亚洲| 色av中文字幕一区| 亚洲免费黄色网址| 国产91丝袜在线观看| 亚洲韩国在线| 超碰aⅴ人人做人人爽欧美| 日韩一区二区三区免费看 | 成人免费小视频| 动漫av网站免费观看| 国产一区二区三区视频在线| 亚洲欧美精品在线| 国产精品16p| 国产一区二区不卡| 亚洲制服中文| 国产精品字幕| 亚洲精品一区二区三区不| 唐朝av高清盛宴| 九九九久久久精品| 亚洲国产日韩综合一区| 欧洲一区二区三区精品| 亚洲第一区在线| 免看一级a毛片一片成人不卡| 麻豆精品一区二区三区| 茄子视频成人在线观看| а√在线中文网新版地址在线| 欧美成人video| 欧美成人精品欧美一| 韩国精品免费视频| 婷婷四房综合激情五月| 日本在线精品| 日韩在线观看网址| 在线观看毛片av| 国产精品麻豆久久久| 亚洲第一中文av| 欧美精品一区二区三区中文字幕| 日韩男女性生活视频| 九色视频在线观看免费播放| 色婷婷精品久久二区二区蜜臂av | 国产高清在线观看视频| 综合色天天鬼久久鬼色| 欧美一级视频在线| 99re66热这里只有精品8| 国产欧美日韩亚洲精品| 欧美黑人激情| 欧美一区二区女人| 青青草在线观看视频| 国v精品久久久网| 欧美视频在线免费播放| 五月综合久久| 国产精品久久久av| 欧美猛烈性xbxbxbxb| 91精品国产综合久久蜜臀| 丝袜美腿小色网| 懂色av一区二区夜夜嗨| 欧美视频免费看欧美视频| 欧美重口另类| 国产精品2018| 欧美成年黄网站色视频| 日韩午夜小视频| 97人人澡人人爽人人模亚洲| 91小视频免费看| 日本久久精品一区二区| 欧美丰满老妇| 国产欧美一区二区三区另类精品| 偷拍自拍在线看| 在线观看成人黄色| 国产99视频在线| 无码av中文一区二区三区桃花岛| 给我看免费高清在线观看| 老司机精品导航| 福利网在线观看| 久久国产精品色av免费看| 青青草成人在线| 久操视频在线免费播放| 精品福利一区二区三区免费视频| 久久精品国产成人av| 国产精品美女久久久久久久| 久久久久亚洲av无码网站| 久久激情一区| 成人区一区二区| 不卡在线一区二区| 国产精选一区二区| 国产a亚洲精品| 午夜精品视频网站| 最新真实国产在线视频| 精品裸体舞一区二区三区| 中文字幕永久在线| 亚洲va欧美va国产va天堂影院| 五月天综合视频| av中文字幕亚洲| 一级黄色在线播放| 亚洲欧美日韩综合国产aⅴ| 中文字幕综合在线观看| 色哟哟精品丝袜一区二区| 成人黄色av网| 韩国成人漫画| 久久久久久久91| 美女写真理伦片在线看| 精品小视频在线| 亚洲精品喷潮一区二区三区| 欧洲色大大久久| 日本中文字幕免费观看| 亚洲色图视频网站| 久久久久久久毛片| 99国产精品99久久久久久| 超碰成人在线播放| 久久一本综合频道| 久久综合九色综合88i| 亚洲一区 二区 三区| 午夜欧美性电影| 国产91精品对白在线播放| 国产精品免费在线| 日韩一区二区三区在线看| 国产日韩欧美黄色| 99久久伊人| 国产精品久久久久久一区二区 | 亚洲福利电影网| 午夜剧场免费在线观看| 国产精品美女久久久久久2018| 精品少妇人妻一区二区黑料社区| 成人动漫视频在线| 成人做爰69片免费| 国产91色综合久久免费分享| √天堂资源在线| 精品一区二区三区不卡| 怡红院亚洲色图| 久久精品72免费观看| 婷婷六月天在线| 免费看精品久久片| 艹b视频在线观看| 日本不卡123| 日本888xxxx| 奇米一区二区三区av| 五月婷婷狠狠操| 美女在线一区二区| 国产三级国产精品国产专区50| 日韩1区2区3区| 国产又大又黄又粗又爽| 美女精品自拍一二三四| 一区二区三区网址| 精品亚洲成a人| 国产欧美精品一二三| 国产精品一品二品| 老熟女高潮一区二区三区| 成人黄色一级视频| 六十路息与子猛烈交尾| 久久午夜羞羞影院免费观看| 久久久久久久久久久久久久久| 欧美经典一区二区三区| 国精产品视频一二二区| 亚洲人123区| 亚洲精品在线观看av| 欧美日韩国产一区在线| 懂色av蜜臀av粉嫩av分享吧最新章节| 欧美三级一区二区| 99精品人妻无码专区在线视频区| 欧美va亚洲va国产综合| 午夜黄色小视频| 一区二区三区久久精品| 老司机在线看片网av| 欧美激情亚洲综合一区| 日韩伦理在线一区| 国产精品男人爽免费视频1| 高清一区二区三区av| 国产亚洲二区| 成人av国产| h无码动漫在线观看| 国产精品综合| 午夜啪啪小视频| 99久久综合精品| 国产不卡在线观看视频| 一区二区三区在线观看国产 | 欧美日韩和欧美的一区二区| jizz中国少妇| 亚洲一级免费视频| 1区2区3区在线视频| 97香蕉久久夜色精品国产| 日韩不卡在线| 国产a一区二区| 欧美系列电影免费观看 | 在线观看中文| 日韩av123| 伊人久久影院| 天堂av一区二区| 在线成人欧美| 中文字幕第一页在线视频| 99久久综合精品| 国产精品久久久久久久精| 一本久道久久综合中文字幕| 99精品在线视频观看| 亚洲人成电影网站色www| www视频在线免费观看| 国产国产精品人在线视| 日本精品一区二区三区在线观看视频| 日韩av一区二区三区美女毛片| 激情欧美日韩| 涩涩网站在线看| 国产亚洲精品超碰| 在线观看黄网站| 精品欧美一区二区在线观看| 日本在线观看www| 国产福利视频一区二区| 欧美大奶一区二区| 男女激烈动态图| 麻豆精品一区二区av白丝在线| 国产熟妇搡bbbb搡bbbb| 亚洲一区电影777| 99riav国产| 日韩在线观看精品| 欧美日韩尤物久久| 裸模一区二区三区免费| 日韩亚洲在线| 影音先锋资源av| 一区二区三区中文免费| 国产又黄又粗又硬| 社区色欧美激情 | 日韩欧美一区二区三区在线观看| 久久久久久亚洲精品不卡4k岛国 | 国产99久久九九精品无码| 国产成人精品三级麻豆| www.xxxx日本| 7777精品伊人久久久大香线蕉超级流畅| 国产高清在线| 国产精品白丝jk喷水视频一区| 亚洲精品3区| 久草青青在线观看| 91在线观看一区二区| 亚洲一区欧美在线| 亚洲精品成人久久电影| 97天天综合网| 精品综合在线| 亚洲欧美日韩专区| 久久精品视频18| 欧美日韩精品综合在线| 婷婷在线视频观看| 国产在线视频91| 一区二区三区四区电影| 污免费在线观看| 亚洲综合免费观看高清在线观看| 亚洲国产精品久久久久爰性色 | 精品一区二区免费在线观看| 99re6热在线精品视频| 在线成人免费视频| 污污片在线免费视频| av电影成人| 国产日韩1区| 熟女俱乐部一区二区| 欧美亚洲一区二区在线| 中文字幕在线播放| 亚洲影院色在线观看免费| 欧美日本一区二区视频在线观看| 精品人妻人人做人人爽夜夜爽| 亚洲狠狠爱一区二区三区| 性xxxfllreexxx少妇| 国产精品观看在线亚洲人成网| 99免费精品| 一级黄色免费视频| 欧美午夜激情小视频| av电影在线网| 亚洲综合色激情五月| 亚洲免费观看| 国产激情av在线| 日韩欧美中文一区二区| 国产中文在线播放| 日韩性感在线| 国产精品一级片| 99精品人妻国产毛片| 日韩在线观看免费全集电视剧网站 | 亚洲蜜臀av乱码久久精品蜜桃| 韩国av免费在线| 国产精品777| 综合精品一区| 国产精品亚洲无码| 日韩欧美中文字幕公布| 韩国主播福利视频一区二区三区| 在线综合视频网站| 99视频在线观看一区三区| 久久这里只有精品9| 欧美激情a∨在线视频播放| 免费观看久久av| 男人操女人下面视频|