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

Glibc 內存分配與釋放機制詳解

開發 開源
本文以一次線上故障為基礎介紹了使用 glibc 進行內存管理可能碰到問題,進而對庫中內存分配與釋放機制進行分析,最后提供了相應問題的解決方案。

一、引言

內存對象的分配與釋放一直是后端開發人員代碼設計中需要考慮的問題,考慮不周極易造成內存泄漏、內存訪問越界等問題。在發生內存異常后,開發人員往往花費大量時間排查用戶管理層代碼,而忽視了C運行時,庫層和操作系統層本身的實現也可能會帶來內存問題。本文先以一次線上內存事故引出問題,再逐步介紹 glibc 庫的內存布局設計、內存分配、釋放邏輯,最后給出相應的解決方案。

二、內存告警事件

在一次線上運維過程中發現服務出現內存告警。

【監控系統-自定義監控-告警-持續告警】

檢測規則: xxx內存使用率監測:一般異常(>4096)
集群id:xxx
集群名稱: xxxxxx
異常對象(當前值): xx.xx.xx.xx-xxxxxxx(11335)
開始時間: 2023-08-10 17:10:30
告警時間: 2023-08-10 18:20:32
持續時間: 1h10m2s
異常比例: 2.1918 (8/365)
異常級別: 一般
備注:-

隨即查看服務相關監控,判斷是業務流量激增帶來的內存短時間增高,或是發生了內存泄漏。

圖片

圖片

通過查看 OPS 和服務自身統計的內存監控,發現在告警時間內存在業務流量突增現象,但是內存已經下降到正常值了。然而告警持續到了18:20依然沒有恢復,跟監控表現不符,登錄機器后發現實例的內存并沒有恢復,隨即懷疑用戶層發生內存泄漏。

經過分析,由于內存統計代碼每次調用 new、delete 之后才會對統計值進行增減,而監控中服務統計內存已經下降,說明已經正常調用 delete 進行內存釋放,而操作系統層面發現內存依然居高不下,懷疑使用的c運行庫 glibc 存在內存釋放問題。

三、glibc 內存管理機制

3.1 glibc 簡介

glibc 全稱為 GUN C Library,是一個開源的標準C庫,其對操作系統相關調用進行了封裝,提供包括數學、字符串、文件 I/O、內存管理、多線程等方面標準函數和系統調用接口供用戶使用。

3.2 內存管理布局

以 Linux 內核 v2.6.7 之后的32位模式下的虛擬內存布局方式為例:

圖片


  1. Kernel Space(內核空間)— 存儲內核和驅動程序的代碼和數據;
  2. Stack(棧區)— 存儲程序執行期間的本地變量和函數的參數,從高地址向低地址生長;
  3. Memory Mapping Segment(內存映射區)— 簡稱為 mmap,用來文件或其他對象映射進內存;
  4. Heap(堆區)— 動態內存分配區域,通過 malloc、new、free 和 delete 等函數管理;
  5. BSS segment(未初始化變量區)— 存儲未被初始化的全局變量和靜態變量;
  6. DATA segment(數據區)— 存儲在源代碼中有預定義值的全局變量和靜態變量;
  7. TEXT segment(代碼區)— 存儲只讀的程序執行代碼,即機器指令。

其中 Heap 和 Mmap 區域是可以提供給用戶程序使用的虛擬內存空間。

Heap 操作

操作系統提供了 brk() 函數,c運行時庫提供了 sbrk() 函數從 Heap 中申請內存,函數聲明如下:

int brk(void *addr);
void *sbrk(intptr_t increment);
  • brk() 通過設置進程堆的結束地址進行內存分配與釋放,即可以一次性的分配或釋放一整段連續的內存空間。比較適合于一次性分配大塊內存的情況,如果設置的結束地址過大或過小會造成內存碎片或內存浪費的問題。
  • sbrk 函數通過傳入的 increment 參數決定增加或減少堆空間的大小,可以動態的多次分配或釋放空間達到需要多少內存就申請多少內存的效果,有效避免了內存碎片和浪費問題。

Mmap 操作

在 Linux 中提供了 mmap() 和 munmap() 函數操作虛擬內存空間,函數聲明如下:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);

其中 mmap 能夠將文件或者其他對象映射進內存,munmap 能夠刪除特定地址區域的內存映射。

3.3 內存分配器

開源社區公開了很多現成的內存分配器,包括 dlmalloc、ptmalloc、jemalloc、tcmalloc......,由于 glibc 用的是 ptmalloc 所以本文只對該內存分配器進行介紹。

3.3.1 Arena(分配區)

堆管理結構如下所示:

struct malloc_state {
 mutex_t mutex;                 /* Serialize access. */
 int flags;                       /* Flags (formerly in max_fast). */
 #if THREAD_STATS
 /* Statistics for locking. Only used if THREAD_STATS is defined. */
 long stat_lock_direct, stat_lock_loop, stat_lock_wait;
 #endif
 mfastbinptr fastbins[NFASTBINS];    /* Fastbins */
 mchunkptr top;
 mchunkptr last_remainder;
 mchunkptr bins[NBINS * 2];
 unsigned int binmap[BINMAPSIZE];   /* Bitmap of bins */
 struct malloc_state *next;           /* Linked list */
 INTERNAL_SIZE_T system_mem;
 INTERNAL_SIZE_T max_system_mem;
 };

ptmalloc 對進程內存是通過一個個的分配區進行管理的,而分配區分為主分配區(arena)和非主分配區(narena),兩者區別在于主分配區中可以使用 sbrk 和 mmap 向操作系統申請內存,而非主分配區只能通過 mmap 申請內存。


圖片

對于一個進程,只有一個主分配區和若干個非主分配區,主分配區只能由第一個線程來創建持有,其和非主分配區由環形鏈表的形式相互連接,整個分配區中通過變量互斥鎖支持多線程訪問。

當一個線程調用 malloc 申請內存時,該線程先查看線程私有變量中是否已經存在一個分配區。如果存在,則對該分配區加鎖,加鎖成功的話就用該分配區進行內存分配;失敗的話則搜索環形鏈表找一個未加鎖的分配區。如果所有分配區都已經加鎖,那么 malloc 會開辟一個新的分配區加入環形鏈表并加鎖,用它來分配內存。釋放操作同樣需要獲得鎖才能進行。

3.3.2 chunk

ptmalloc 通過 malloc_chunk 來管理內存,定義如下:

struct malloc_chunk { 
  INTERNAL_SIZE_T      prev_size;    /* Size of previous chunk (if free).  */ 
  INTERNAL_SIZE_T      size;         /* Size in bytes, including overhead. */ 
   
  struct malloc_chunk* fd;           /* double links -- used only if free. */ 
  struct malloc_chunk* bk; 
   
  /* Only used for large blocks: pointer to next larger size.  */ 
  struct malloc_chunk* fd_nextsize;      /* double links -- used only if free. */ 
  struct malloc_chunk* bk_nextsize;
};


  • prev_size:存儲前一個 chunk 的大小。如果前一個 chunk 沒有被使用,則 prev_size 的值表示前一個 chunk 的大小,如果前一 chunk 已被使用,則 prev_size 的值沒有意義。
  • size:表示當前 chunk 的大小,包括所請求的有效數據大小,以及堆塊頭部和尾部的管理信息等附加信息的大小。
  • fd 和 bk:表示 chunk 在空閑鏈表中的前一個和后一個堆塊的指針。如果該 chunk 被占用,則這兩個指針沒有意義。
  • fd_nextsize 和 bk_nextsize:表示同一空閑鏈表上下一個堆塊的指針。fd_nextsize 指向下一個比當前 chunk 大小大的第一個空閑 chunk , bk_nextszie 指向前一個比當前 chunk 大小小的第一個空閑 chunk,增加這兩個字段可以加快遍歷空閑 chunk ,并查找滿足需要的空閑 chunk 。

使用該數據結構能夠更快的在鏈表中查找到空閑 chunk 并分配。

3.3.3 空閑鏈表(bins)

在 ptmalloc 中,會將大小相似的 chunk 鏈接起來,叫做空閑鏈表(bins),總共有128個 bin 供 ptmalloc 使用。用戶調用 free 函數釋放內存的時候,ptmalloc 并不會立即將其歸還操作系統,而是將其放入 bins 中,這樣下次再調用 malloc 函數申請內存的時候,就會從 bins 中取出一塊返回,這樣就避免了頻繁調用系統調用函數,從而降低內存分配的開銷。

在 ptmalloc 中,bin主要分為以下四種:

  • fast bin
  • unsorted bin
  • small bin
  • large bin

其中根據 bin 的分類,可以分為 fast bin 和 bins,而 bins 又可以分為 unsorted bin、small bin 以及 large bin 。


圖片


fast bin

程序在運行時會經常需要申請和釋放一些較小的內存空間。當分配器合并了相鄰的幾個小的 chunk 之后,也許馬上就會有另一個小塊內存的請求,這樣分配器又需要從大的空閑內存中切分出一塊,這樣無疑是比較低效的,故而, malloc 中在分配過程中引入了 fast bins 。

fast bin 總共有10個,本質上就是10個單鏈表,每個 fast bin 中所包含的 chunk size 以8字節逐漸遞增,即如果第一個 fast bin 中 chunk size 均為16個字節,第二個 fast bin 的 chunk size 為24字節,以此類推,最后一個 fast bin 的 chunk size 為80字節。值得注意的是 fast bin 中 chunk 釋放并不會與相鄰的空閑 chunk 合并,這是由于 fast bin 設計的初衷就是小內存的快速分配和釋放,因此系統將屬于 fast bin 的 chunk 的P(未使用標志位)總是設置為1,這樣即使當 fast bin 中有某個 chunk 同一個 free chunk 相鄰的時候,系統也不會進行自動合并操作。

malloc 操作:

在 malloc 申請內存的時候,如果申請的內存大小范圍在fast bin 以內,則先在 fast bin 中進行查找,如果 fast bin 中存在空閑 chunk 則返回。否則依次從 small bin、unsorted bin、large bin 中進行查找。

free 操作:

先通過 chunksize 函數根據傳入的地址指針獲取該指針對應的 chunk 的大小;然后根據這個 chunk 大小獲取該 chunk 所屬的 fast bin,然后再將此 chunk 添加到該 fast bin 的鏈尾。

unsorted bin

是 bins 的緩沖區,顧名思義,unsorted bin 中的 chunk 無序,這種設計能夠讓 glibc 的 malloc 機制有第二次機會重新利用最近釋放的 chunk 從而加快內存分配的時間。

與 fast bin 不同,unsorted bin 采用的是 FIFO 的方式。

malloc 操作:

當需要的內存大小大于 fast bin 的最大大小,則先在 unsorted 中尋找,如果找到了合適的 chunk 則直接返回,否則繼續在 small bin 和l arge bin中搜索。

free 操作:

當釋放的內存大小大于fast bin的最大大小,則將釋放的 chunk 寫入 unsorted bin。

small bin

大小小于512字節的 chunk 被稱為 small chunk,而保存 small chunks 的 bin 被稱為 small bin。62個 small bin 中,每個相鄰的的 small bin 之間相差8字節,同一個 small bin 中的 chunk 擁有相同大小。

small bin 指向的是包含空閑區塊的雙向循環鏈表。內存分配和釋放邏輯如下:

malloc 操作:

當需要的內存不存在于 fast bin 和 unsorted bin 中,并且大小小于512字節,則在 small bin 中進行查找,如果找到了合適的 chunk 則直接返回。

free 操作:

free 一個 chunk 時會檢查該 chunk 相鄰的 chunk 是否空閑,如果空閑則需要先合并,然后將合并的 chunk 先從所屬的鏈表中刪除然后合并成一個新的 chunk,新的 chunk 會被添加在 unsorted bin 鏈表的前端。

large bin

大小大于等于512字節的 chunk 被稱為 large chunk,而保存 large chunks 的 bin 被稱為 large bin。large bins 中每一個 bin 分別包含了一個給定范圍內的 chunk,其中的 chunk 按大小遞減排序,大小相同則按照最近使用時間排列。63 large bin 中的每一個都與 small bin 的操作方式大致相同,但不是存儲固定大小的塊,而是存儲大小范圍內的塊。每個 large bin 的大小范圍都設計為不與 small bin  的塊大小或其他large bin 的范圍重疊。

malloc 操作:

首先確定用戶請求的大小屬于哪一個 large bin,然后判斷該 large bin 中最大的 chunk 的 size 是否大于用戶請求的 size。如果大于,就從尾開始遍歷該 large bin,找到第一個 size 相等或接近的 chunk,分配給用戶。如果該 chunk 大于用戶請求的 size 的話,就將該 chunk 拆分為兩個 chunk:前者返回給用戶,且 size 等同于用戶請求的 size;剩余的部分做為一個新的 chunk 添加到 unsorted bin 中。

free 操作:

large bin 的 fee 操作與 small bin 一致,此處不再贅述。

3.3.4 特殊 chunk

top chunk

top chunk 是堆最上面的一段空間,它不屬于任何 bin,當所有的 bin 都無法滿足分配要求時,就要從這塊區域里來分配,分配的空間返回給用戶,剩余部分形成新的 top chunk,如果 top chunk 的空間也不滿足用戶的請求,就要使用 brk 或者 mmap 來向系統申請更多的堆空間(主分配區使用 brk、sbrk,非主分配區使用 mmap)。

mmaped chunk

當分配的內存非常大(大于分配閥值,默認128K)的時候需要被 mmap 映射,則會放到 mmaped chunk 上,釋放 mmaped chunk 上的內存的時候會將內存直接交還給操作系統。(chunk 中的M標志位置1)

last remainder chunk

如果用戶申請的 size 屬于 small bin 的,但是又不能精確匹配的情況下,這時候采用最佳匹配(比如申請128字節,但是對應的bin是空,只有256字節的 bin 非空,這時候就要從256字節的 bin 上分配),這樣會 split chunk 成兩部分,一部分返給用戶,另一部分形成 last remainder chunk,插入到 unsorted bin 中。

3.3.5 hunk 的合并與切分

合并

當 chunk 釋放時,如果前后兩個相鄰的 chunk 均空閑,則會與前后兩個相鄰 chunk 合并,隨后將合并結果放入 unsorted bin 中。

切分

當需要分配的內存小于待分配的 chunk 塊,則會將待分配 chunk 塊切割成兩個 chunk 塊,其中一個 chunk 塊大小等同于用戶需要分配內存的大小。需要注意的是分裂后的兩個 chunk 必須均大于 chunk 的最小大小,否則不會進行拆分。

3.4 內存分配

內存分配流程可以分為三步:

第一步:根據用戶請求大小轉換為實際需要分配 chunk 空間的大小;

第二步:在 bins 中搜索還沒有歸還給操作系統的 chunk 塊,具體流程如下圖所示。

圖片


  • 如果所需分配的 chunk 大小小于等于 max_fast (fast bins 中要求的最大 chunk 大小,默認為64B),則嘗試在 fast bins 中獲取 chunk,如果獲取 chunk 則返回。否則進入下一步。
  • 判斷所需大小是否可能處于 small bins 中,即判斷 chunk_size < 512B是否成立。如果 chunk 大小處在 small bins 中則在 small bins 中搜索合適的 chunk,即找到合適的 small bin,然后從該 bin 的尾部摘取一個滿足大小要求的 chunk 返回。如果 small bins 中無法找到合適的 chunk 則進入下一步。
  • 到這一步說明待分配的內存塊要么是一個大的 chunk,要么只是沒有在 small bin 中找到。分配器先在 fast bin 中嘗試合并 chunk,并將 chunk 寫入 unsorted chunk 中,此時再遍歷 unsorted chunk 如果能夠找到合適的 chunk 則按需將該 chunk 切分(可能不需要),將生成的 chunk 中其中一個放入 small bins 或者 large bins 中,另一個與待分配內存塊相同大小的 chunk 則返回。
  • 在 large bins 中搜索合適的 chunk,如果能夠找到則將該 chunk 切分成需要分配的內存大小,另一部分則繼續寫入 bins 中。如果無法找到合適的 chunk,則進入下一步。
  • 嘗試從 top chunk 中分配一塊內存給用戶,剩下一部分生成新的 top chunk 。

第三步:如果 top chunk 依然無法滿足分配請求,通過 sbrk 或 mmap 增加 top chunk 的大小并分配內存給用戶。

3.5 內存釋放

圖片


  1. 判斷當前 chunk 是否是 mmap 映射區域映射的內存,如果是則直接使用 munmap 釋放這塊內存映射(內存映射的內存能夠通過標記進行識別);
  2. 判斷 chunk 是否與 top chunk 相鄰,如果相鄰則直接與 top chunk 合并;
  3. 如果 chunk 的大小大于 max_fast(64B),則將其放入 unsorted bin,
    并檢查是否有合并,如果能夠合并則將 chunk 合并后根據大小加入合適的 bin 中;
  4. 如果 chunk 的大小小于
    max_fast(64B),則直接放入 fast bin 中,如果沒有合并情況則 free 內存。如果在當前 chunk 相鄰的 chunk 空閑,則觸發合并,并將合并后的結果寫入 unsorted bin 中,此時如果合并后的結果大于 max_fast(64B),則觸發整個 fast bins 的合并操作,此時 fast bins 將會被遍歷,將所有相鄰的空閑 chunk 進行合并,然后將合并后的 chunk 寫入 unsorted bin 中,fast bin 此時會變為空。如果合并后的 chunk 與 top chunk 相鄰則會合并到 top chunk 中;
  5. 如果 top chunk 大小大于 mmap 收縮閾值(默認128KB),如果是,則對于主分配區則會試圖歸還 top chunk 中一部分給操作系統,此時 free 結束。

3.6 內存碎片

圖片

按照 glibc 的內存分配策略,我們考慮下如下場景:

1.假設 brk 起始地址為512k

2.malloc 40k 內存,即 chunk A,brk = 512k + 40k = 552k

3.malloc 50k 內存,即 chunk B,brk = 552k + 50k = 602k

4.malloc 60k 內存,即 chunk C,brk = 602k + 60k = 662k

5.free chunk A。

此時 chunk A 為空閑塊,但是如果 chunk C 和 chunk B 一直不釋放無法直接通過移動brk指針來釋放 chunk A 的內存,必須等待 chunk B 和 chunk C 釋放才能和 top chunk 合并并將內存歸還給操作系統。

四、問題分析與解決

通過前面的內存分配器運行原理能夠很容易得出原因,由于程序中連續調用 free/delete 釋放內存僅僅只是將內存寫入內存分配器的 bins 中,并沒有將其歸還給操作系統,所以會出現疑似內存未回收的情況。并且如果每次 delete 的內存都不與 top chunk 相鄰,會導致 chunk 塊長時間留在空閑鏈表中無法合并到 top chunk,從而出現內存無法釋放給操作系統的現象。

4.1 優化辦法

  1. 通過限制服務端內存最大大小能夠有效避免內存被c運行庫撐的太高,導致服務器 OOM 的情況。
  2. c運行庫替換成 jemalloc,jemalloc 與 glibc 的實現方式不同,能夠更快將內存歸還給操作系統。

4.2 效果對比測試

為了驗證優化后的內存使用效果,編寫測試代碼,模擬線上 pipline 模式下的3000萬次連續請求,對比請求過程中的內存峰值、連接斷開后的內存使用狀況:

glibc內存分配器

內存峰值

圖片

連接斷開后內存占用

圖片

jemalloc內存分配器

內存峰值

圖片


連接斷開后內存占用

圖片

根據測試結果,jemalloc 相較于 glibc 釋放空閑內存速度快12%。

參考鏈接

  1. https://www.gnu.org/software/libc/manual/html_node/
  2. https://github.com/hustfisher/ptmalloc/blob/master/README
  3. https://stackoverflow.com/questions/13480235/libc-memory-management
  4. https://zhuanlan.zhihu.com/p/637659294
責任編輯:龐桂玉 來源: vivo互聯網技術
相關推薦

2025-06-03 04:00:05

glibc堆內存Linux

2011-08-16 15:13:49

IOS編程內存

2023-10-18 13:31:00

Linux內存

2025-05-29 03:20:00

2025-09-26 05:11:00

2011-05-26 15:41:25

java虛擬機

2011-07-15 01:10:13

C++內存分配

2009-09-02 09:23:26

.NET內存管理機制

2023-12-27 13:55:00

C++內存分配機制new

2025-07-31 03:00:22

2009-08-26 14:52:19

.NET Framew

2010-09-26 13:23:13

JVM內存管理機制

2009-06-10 22:03:40

JavaScript內IE內存泄漏

2013-10-12 13:01:51

Linux運維內存管理

2011-06-29 17:20:20

Qt 內存 QOBJECT

2010-12-10 15:40:58

JVM內存管理

2009-06-03 15:52:34

堆內存棧內存Java內存分配

2023-04-03 08:25:02

Linux內存slub

2018-05-08 08:46:47

Linux內存釋放

2020-08-18 19:15:44

Redis內存管理
點贊
收藏

51CTO技術棧公眾號

日韩午夜在线电影| 88久久精品| 亚洲天堂久久久久久久| 成人av免费看| 黄色一级视频免费看| 99tv成人| 日韩精品中文字| 天天综合网久久| 成人高潮aa毛片免费| 国产日韩一级二级三级| 国产a一区二区| 亚洲综合图片网| 欧美日韩综合| 在线国产精品视频| 国产+高潮+白浆+无码| 日韩高清成人| 亚洲不卡av一区二区三区| 亚洲高清精品中出| 天堂在线视频网站| 黄网站免费久久| 国产www精品| 久久久久无码国产精品| 欧美激情欧美| 亚洲天堂开心观看| 亚洲中文字幕无码一区| 高清精品久久| 欧美日韩一区高清| 日批视频在线免费看| 日本性爱视频在线观看| 亚洲欧洲日韩在线| 日韩一本精品| 可以直接在线观看的av| 成人精品高清在线| 亚洲在线免费观看| 亚洲综合免费视频| 蜜臀av亚洲一区中文字幕| 2019av中文字幕| 亚洲精品午夜久久久久久久| 国产精品伦理久久久久久| 国产亚洲在线播放| 亚洲综合色一区| 日韩极品在线| 亚洲精品国偷自产在线99热| 最新日本中文字幕| 亚洲大奶少妇| 欧美一个色资源| 日本黄色福利视频| 欧美日韩在线精品一区二区三区激情综合 | 成人影视亚洲图片在线| 精品无人区乱码1区2区3区在线| 中文字幕在线观看91| 久久国际精品| 91精品国产色综合久久ai换脸| 国产超碰在线播放| 成人免费黄色| 欧美日韩国产成人在线91| 国产 porn| 国产成人a视频高清在线观看| 欧洲一区二区三区在线| 不卡av免费在线| 亚洲电影有码| 欧美日韩电影在线| 国产精欧美一区二区三区白种人| 欧洲精品久久久久毛片完整版| 欧美婷婷六月丁香综合色| 91香蕉视频导航| 婷婷激情成人| 欧美久久高跟鞋激| 黑人巨大猛交丰满少妇| 99精品在免费线中文字幕网站一区| 精品国产髙清在线看国产毛片 | 国产天堂第一区| 蜜臀久久99精品久久久久久9| 国产精品视频男人的天堂| 88av在线视频| 欧美a视频在线观看| 欧美电影院免费观看| 日韩美女一区二区三区四区| 中文字幕一区二区三区人妻在线视频| 亚洲日本va中文字幕| 亚洲激情中文字幕| 欧美黄色激情视频| 91综合视频| 久久久久久噜噜噜久久久精品| 亚州国产精品视频| 日韩精品一二三| 亚洲www永久成人夜色| 成人久久久精品国产乱码一区二区 | 亚洲一区精品在线观看| 国产一区二区美女| 精品一区久久| 欧美精品videos另类| 亚洲一级电影视频| 国产又黄又大又粗视频| 成年美女黄网站色大片不卡| 欧美精品自拍偷拍动漫精品| 久久久久亚洲无码| 久久精品高清| 7777精品久久久久久| 91久久精品国产91性色69| 丁香一区二区三区| 亚洲图片欧洲图片日韩av| 三级网站视频在在线播放| 欧美午夜精品久久久久久久| 色婷婷激情视频| 欧洲亚洲一区二区三区| 久久精品成人一区二区三区| wwwxxx亚洲| 国产精品中文字幕欧美| 日本10禁啪啪无遮挡免费一区二区| 黄色在线播放网站| 91国产福利在线| 日韩女优在线视频| 香蕉视频国产精品| 热久久免费视频精品| www.国产视频| 国产精品美女久久久久久久网站| 九九爱精品视频| 国产亚洲字幕| 尤物九九久久国产精品的分类| 国语对白一区二区| 狠狠久久亚洲欧美| 亚洲一区二区精品在线| 一区二区电影免费观看| 亚洲电影av在线| 国产高潮流白浆| 免费精品视频在线| 日本一区二区三区在线视频| 三级中文字幕在线观看| 精品国产乱码久久久久久老虎| 天天爽天天爽天天爽| 久久久蜜桃一区二区人| 久久久人人爽| 欧美aa一级| 日韩精品免费在线| 国产情侣在线视频| 成人一区二区三区视频在线观看| 久久免费视频2| 欧美黄色成人| 精品国产区一区二区三区在线观看| 波多野结衣视频观看| 久久久国产精品不卡| 18禁免费无码无遮挡不卡网站| 国产一区在线电影| 久久久噜噜噜久久| 国产综合在线播放| 亚洲一区二区三区影院| 精品国产一二区| 韩日欧美一区| 国产在线精品一区二区三区》| 免费在线播放电影| 亚洲国产精品久久久| 波多野结衣国产| 久久综合九色综合欧美就去吻| 免费一级特黄特色毛片久久看| 激情亚洲另类图片区小说区| 91精品国产高清久久久久久| 手机看片福利在线观看| 91福利视频在线| 中文字幕第二区| 国产一区二区91| 极品粉嫩国产18尤物| 欧美电影在线观看免费| 日本精品免费观看| av午夜在线| 欧美一区二区三区色| 久久久久人妻一区精品色欧美| 成人av免费在线播放| 丰满人妻中伦妇伦精品app| 成人影视亚洲图片在线| 亚洲最大福利视频网| 岛国av在线播放| 亚洲人高潮女人毛茸茸| 97人妻精品一区二区三区| 一区二区三区免费看视频| 亚洲av无码一区东京热久久| 国产农村妇女精品一二区| 日韩三级电影免费观看| 国产精品高清一区二区| 久久久久久久国产精品视频| 日韩偷拍自拍| 欧美日韩夫妻久久| 99免费在线观看| 国产欧美视频一区二区| 91大神免费观看| 亚洲一区久久| 一区二区免费电影| 欧美日日夜夜| 91精品国产自产在线| 1024在线看片你懂得| 国产一区二区三区丝袜| 亚洲AV无码国产精品午夜字幕 | 日韩精品视频观看| 九九视频精品在线观看| 影视一区二区| 区一区二区三区中文字幕 | 不卡视频一区二区| 亚洲成a人片| 欧美精品日韩三级| 毛片在线播放网站| 欧美zozozo| 在线视频 91| 欧美日韩日本国产| 免费在线黄色网| 国产欧美一区二区三区鸳鸯浴| 91porn在线| 日韩av在线发布| 一二三四视频社区在线| 亚洲精品成人| 水蜜桃亚洲精品| 性欧美xxxx免费岛国不卡电影| 91手机视频在线观看| 久久人体大尺度| 国内精品久久久久久| 免费网站成人| 亚洲小视频在线观看| 欧美一区二区公司| 欧美一区二区三区影视| 中文字幕一区2区3区| 福利精品视频在线| 久久久久久天堂| 亚洲精品午夜久久久| 超薄肉色丝袜一二三| 94色蜜桃网一区二区三区| 欧美日韩一区二区区| 久久精品国产久精国产爱| 50路60路老熟妇啪啪| 国产日韩视频| 日韩av新片网| 欧美三区不卡| 日本久久高清视频| 激情五月综合| 久久国产精品免费一区| 成人知道污网站| 岛国一区二区三区高清视频| 日韩午夜视频在线| 国产一区红桃视频| 国产精品黄色片| 国产精品免费电影| 成人国产精品入口免费视频| 国产成人高潮免费观看精品| 成人美女视频| 欧美一区二区三区图| 校园春色亚洲| 欧美中文字幕在线播放| 亚洲精品**中文毛片| 欧美亚洲免费电影| 欧美电影免费观看| 日韩美女在线观看| 不卡亚洲精品| 欧美日韩中文一区| 国产偷人视频免费| 久久都是精品| 亚洲少妇久久久| 久久99精品一区二区三区三区| 最近中文字幕一区二区| 卡一卡二国产精品 | 国产a精品视频| 深夜视频在线观看| 91一区二区在线| 欧美激情aaa| 亚洲国产精品av| 日本 欧美 国产| 亚洲精品日韩综合观看成人91| 激情小说中文字幕| 福利视频导航一区| 中文字幕网址在线| 日韩欧美国产精品一区| 神宫寺奈绪一区二区三区| 国产偷亚洲偷欧美偷精品| 91在线视频免费看| 久久国产天堂福利天堂| av在线播放观看| 欧美一级片免费在线| 丝袜美腿一区| 91精品中文在线| 粉嫩一区二区三区四区公司1| 久中文字幕一区| 国产精品久久久乱弄 | av小说在线播放| 国产精品jvid在线观看蜜臀| 婷婷成人av| 美日韩精品免费| 91综合久久| 久久国产亚洲精品无码| 久久99久久久欧美国产| 国产高潮失禁喷水爽到抽搐| 久久精品日韩一区二区三区| 黑人巨大精品一区二区在线| 欧美日韩亚洲系列| 国产精品熟女久久久久久| 亚洲国产成人精品久久| 日本www在线观看| 91产国在线观看动作片喷水| 国产精品久久久久久久久久齐齐| 国产精品yjizz| 久久福利影院| 色综合久久久久无码专区| 经典一区二区三区| 极品粉嫩小仙女高潮喷水久久 | 国产无遮挡又黄又爽又色| 在线视频国内自拍亚洲视频| 亚洲黄色a级片| 日韩视频永久免费观看| 亚洲精品成人图区| 丁香婷婷久久久综合精品国产| 成人免费电影网址| 亚洲 高清 成人 动漫| 国产99久久久国产精品| 亚洲欧美综合7777色婷婷| 欧美日韩在线视频一区二区| a级片免费观看| 亚洲国产精品t66y| 色婷婷.com| 国产偷国产偷亚洲高清人白洁| 精品无码m3u8在线观看| 4438x成人网最大色成网站| 国产视频在线看| 8090成年在线看片午夜| 伊色综合久久之综合久久| 爱爱爱视频网站| 美女视频免费一区| 人妻av无码一区二区三区| 精品久久久一区二区| 亚洲国产福利视频| 久久国产精品亚洲| www.久久草.com| 亚洲砖区区免费| 青青青伊人色综合久久| 日本少妇高潮喷水xxxxxxx| 福利精品视频在线| 国产又爽又黄网站亚洲视频123| 欧美精品videosex性欧美| 国产精品视频首页| 99精品视频网站| 九九**精品视频免费播放| 国产一区二区三区四区在线| 色婷婷国产精品综合在线观看| 三级做a全过程在线观看| 97视频在线观看视频免费视频 | 91精品蜜臀在线一区尤物| 成人jjav| 国产精品嫩草视频| 日韩电影一区| 中文字幕在线观看日 | 吴梦梦av在线| 精品一区二区日韩| www日韩在线| 日韩一区二区三区电影在线观看| 黄色片网站在线| 5g国产欧美日韩视频| 欧美成人有码| av免费观看不卡| 天天亚洲美女在线视频| 日韩有码电影| 国产精品一区二区电影| 99久久99热这里只有精品| 天堂av2020| 亚洲综合免费观看高清完整版在线 | 蜜臀av一区二区| 疯狂试爱三2浴室激情视频| 日韩视频在线一区二区| 超碰在线中文字幕| 久久99精品久久久久久青青日本| 亚洲欧美成人综合| 亚洲午夜精品久久久久久高潮| 欧美日韩精品一二三区| 中文字幕免费高清电视剧网站在线观看 | 91在线视频网址| 91视频久久久| 两个人的视频www国产精品| 给我免费播放日韩视频| 国产xxxxx在线观看| 国产精品理论在线观看| av中文字幕在线免费观看| 26uuu久久噜噜噜噜| 色喇叭免费久久综合网| 在线成人精品视频| 欧美日韩一区二区免费视频| www.成人.com| 都市激情久久久久久久久久久| 亚洲一区二区免费看| 美女福利视频网| 精品不卡在线视频| 精品肉辣文txt下载| 99re6这里有精品热视频| 2017欧美狠狠色| 国产乱子伦精品无码码专区| 国内精品久久久| 婷婷亚洲五月| 黄色录像a级片| 69久久夜色精品国产69蝌蚪网| av最新在线| 波多野结衣激情| 久久亚洲精华国产精华液 | 丁香激情综合国产| 进去里视频在线观看| 欧美二区乱c黑人| 日本激情一区| 日韩aaaaa|