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

面試官:小松子來聊一聊內存逃逸

開發 后端
初次看到這個話題,我是懵逼的,怎么還有內存逃逸,內存逃逸到底是干什么的?接下來我們一起來看看什么是內存逃逸。

[[414656]]

本文轉載自微信公眾號「Golang夢工廠」,作者AsongGo。轉載本文請聯系Golang夢工廠公眾號。

前言

哈嘍,大家好,我是asong。最近無聊看了一下Go語言的面試八股文,發現面試官都喜歡問內存逃逸這個話題,這個激起了我的興趣,我對內存逃逸的了解很淺,所以找了很多文章精讀了一下,在這里做一個總結,方便日后查閱、學習。

什么是內存逃逸

初次看到這個話題,我是懵逼的,怎么還有內存逃逸,內存逃逸到底是干什么的?接下來我們一起來看看什么是內存逃逸。

我們都知道一般情況下程序存放在rom或者Flash中,運行時需要拷貝到內存中執行,內存會分別存儲不同的信息,內存空間包含兩個最重要的區域:堆區(Stack)和棧區(Heap),對于我這種C語言出身的人,對堆內存和棧內存的了解還是挺深的。在C語言中,棧區域會專門存放函數的參數、局部變量等,棧的地址從內存高地址往低地址增長,而堆內存正好相反,堆地址從內存低地址往高地址增長,但是如果我們想在堆區域分配內存需要我們手動調用malloc函數去堆區域申請內存分配,然后我使用完了還需要自己手動釋放,如果沒有釋放就會導致內存泄漏。寫過C語言的朋友應該都知道C語言函數是不能返回局部變量地址(特指存放于棧區的局部變量地址),除非是局部靜態變量地址,字符串常量地址、動態分配地址。其原因是一般局部變量的作用域只在函數內,其存儲位置在棧區中,當程序調用完函數后,局部變量會隨此函數一起被釋放。其地址指向的內容不明(原先的數值可能不變,也可能改變)。而局部靜態變量地址和字符串常量地址存放在數據區,動態分配地址存放在堆區,函數運行結束后只會釋放棧區的內容,而不會改變數據區和堆區。

所以在C語言中我們想在一個函數中返回局部變量地址時,有三個正確的方式:返回靜態局部變量地址、返回字符串常量地址,返回動態分配在堆上的地址,因為他們都不在棧區,即使釋放函數,其內容也不會受影響,我們以在返回堆上內存地址為例看一段代碼:

  1. #include "stdio.h" 
  2. #include "stdlib.h" 
  3. //返回動態分配的地址  
  4. int* f1() 
  5.     int a = 9; 
  6.     int *pa = (int*) malloc(8); 
  7.     *pa = a; 
  8.     return pa; 
  9.  
  10. int main() 
  11.     int *pb; 
  12.     pb = f1(); 
  13.     printf("after : *pb = %d\tpb = %p\n",*pb, pb); 
  14.     free(pb); 
  15.     return 1; 

通過上面的例子我們知道在C語言中動態內存的分配與釋放完全交與程序員的手中,這樣就會導致我們在寫程序時如履薄冰,好處是我們可以完全掌控內存,缺點是我們一不小心就會導致內存泄漏,所以很多現代語言都有GC機制,Go就是一門帶垃圾回收的語言,真正解放了我們程序員的雙手,我們不需要在像寫C語言那樣考慮是否能返回局部變量地址了,內存管理交與給編譯器,編譯器會經過逃逸分析把變量合理的分配到"正確"的地方。

說到這里,可以簡單總結一下什么是內存逃逸了:

在一段程序中,每一個函數都會有自己的內存區域存放自己的局部變量、返回地址等,這些內存會由編譯器在棧中進行分配,每一個函數都會分配一個棧楨,在函數運行結束后進行銷毀,但是有些變量我們想在函數運行結束后仍然使用它,那么就需要把這個變量在堆上分配,這種從"棧"上逃逸到"堆"上的現象就成為內存逃逸。

什么是逃逸分析

上面我們知道了什么是內存逃逸,下面我們就來看一看什么是逃逸分析?

上文我們說到C語言使用malloc在堆上動態分配內存后,還需要手動調用free釋放內存,如果不釋放就會造成內存泄漏的風險。在Go語言中堆內存的分配與釋放完全不需要我們去管了,Go語言引入了GC機制,GC機制會對位于堆上的對象進行自動管理,當某個對象不可達時(即沒有其對象引用它時),他將會被回收并被重用。雖然引入GC可以讓開發人員降低對內存管理的心智負擔,但是GC也會給程序帶來性能損耗,當堆內存中有大量待掃描的堆內存對象時,將會給GC帶來過大的壓力,雖然Go語言使用的是標記清除算法,并且在此基礎上使用了三色標記法和寫屏障技術,提高了效率,但是如果我們的程序仍在堆上分配了大量內存,依賴會對GC造成不可忽視的壓力。因此為了減少GC造成的壓力,Go語言引入了逃逸分析,也就是想法設法盡量減少在堆上的內存分配,可以在棧中分配的變量盡量留在棧中。

小結逃逸分析:

逃逸分析就是指程序在編譯階段根據代碼中的數據流,對代碼中哪些變量需要在棧中分配,哪些變量需要在堆上分配進行靜態分析的方法。堆和棧相比,堆適合不可預知大小的內存分配。但是為此付出的代價是分配速度較慢,而且會形成內存碎片。棧內存分配則會非常快。棧分配內存只需要兩個CPU指令:“PUSH”和“RELEASE”,分配和釋放;而堆分配內存首先需要去找到一塊大小合適的內存塊,之后要通過垃圾回收才能釋放。所以逃逸分析更做到更好內存分配,提高程序的運行速度。

Go語言中的逃逸分析

Go語言的逃逸分析總共實現了兩個版本:

  • 1.13版本前是第一版
  • 1.13版本后是第二版

粗略看了一下逃逸分析的代碼,大概有1500+行(go1.15.7)。代碼我倒是沒仔細看,注釋我倒是仔細看了一遍,注釋寫的還是很詳細的,代碼路徑:src/cmd/compile/internal/gc/escape.go,大家可以自己看一遍注釋,其逃逸分析原理如下:

  • pointers to stack objects cannot be stored in the heap:指向棧對象的指針不能存儲在堆中
  • pointers to a stack object cannot outlive that object:指向棧對象的指針不能超過該對象的存活期,也就說指針不能在棧對象被銷毀后依舊存活。(例子:聲明的函數返回并銷毀了對象的棧幀,或者它在循環迭代中被重復用于邏輯上不同的變量)

我們大概知道它的分析準則是什么就好了,具體逃逸分析是怎么做的,感興趣的同學可以根據源碼自行研究。

既然逃逸分析是在編譯階段進行的,那我們就可以通過go build -gcflags '-m -m -l'命令查看到逃逸分析的結果,我們之前在分析內聯優化時使用的-gcflags '-m -m',能看到所有的編譯器優化,這里使用-l禁用掉內聯優化,只關注逃逸優化就好了。

現在我們也知道了逃逸分析,接下來我們就看幾個逃逸分析的例子。

幾個逃逸分析的例子

1. 函數返回局部指針變量

先看例子:

  1. #include "stdio.h" 
  2. #include "stdlib.h" 
  3. //返回動態分配的地址  
  4. int* f1() 
  5.     int a = 9; 
  6.     int *pa = (int*) malloc(8); 
  7.     *pa = a; 
  8.     return pa; 
  9.  
  10. int main() 
  11.     int *pb; 
  12.     pb = f1(); 
  13.     printf("after : *pb = %d\tpb = %p\n",*pb, pb); 
  14.     free(pb); 
  15.     return 1; 

查看逃逸分析結果:

  1. go build -gcflags="-m -m -l" ./test1.go 
  2. # command-line-arguments 
  3. ./test1.go:6:9: &res escapes to heap 
  4. ./test1.go:6:9:         from ~r2 (returnat ./test1.go:6:2 
  5. ./test1.go:4:2: moved to heap: res 

分析結果很明了,函數返回的局部變量是一個指針變量,當函數Add執行結束后,對應的棧楨就會被銷毀,但是引用已經返回到函數之外,如果我們在外部解引用地址,就會導致程序訪問非法內存,就像上面的C語言的例子一樣,所以編譯器經過逃逸分析后將其在堆上分配內存。

2. interface類型逃逸

先看一個例子:

  1. func main()  { 
  2.  str := "asong太帥了吧" 
  3.  fmt.Printf("%v",str) 

查看逃逸分析結果:

  1. go build -gcflags="-m -m -l" ./test2.go  
  2. # command-line-arguments 
  3. ./test2.go:9:13: str escapes to heap 
  4. ./test2.go:9:13:        from ... argument (arg to ...) at ./test2.go:9:13 
  5. ./test2.go:9:13:        from *(... argument) (indirection) at ./test2.go:9:13 
  6. ./test2.go:9:13:        from ... argument (passed to call[argument content escapes]) at ./test2.go:9:13 
  7. ./test2.go:9:13: main ... argument does not escape 

str是main函數中的一個局部變量,傳遞給fmt.Println()函數后發生了逃逸,這是因為fmt.Println()函數的入參是一個interface{}類型,如果函數參數為interface{},那么在編譯期間就很難確定其參數的具體類型,也會發送逃逸。

觀察這個分析結果,我們可以看到沒有moved to heap: str,這也就是說明str變量并沒有在堆上進行分配,只是它存儲的值逃逸到堆上了,也就說任何被str引用的對象必須分配在堆上。如果我們把代碼改成這樣:

  1. func main()  { 
  2.  str := "asong太帥了吧" 
  3.  fmt.Printf("%p",&str) 

查看逃逸分析結果:

  1. go build -gcflags="-m -m -l" ./test2.go 
  2. # command-line-arguments 
  3. ./test2.go:9:18: &str escapes to heap 
  4. ./test2.go:9:18:        from ... argument (arg to ...) at ./test2.go:9:12 
  5. ./test2.go:9:18:        from *(... argument) (indirection) at ./test2.go:9:12 
  6. ./test2.go:9:18:        from ... argument (passed to call[argument content escapes]) at ./test2.go:9:12 
  7. ./test2.go:9:18: &str escapes to heap 
  8. ./test2.go:9:18:        from &str (interface-converted) at ./test2.go:9:18 
  9. ./test2.go:9:18:        from ... argument (arg to ...) at ./test2.go:9:12 
  10. ./test2.go:9:18:        from *(... argument) (indirection) at ./test2.go:9:12 
  11. ./test2.go:9:18:        from ... argument (passed to call[argument content escapes]) at ./test2.go:9:12 
  12. ./test2.go:8:2: moved to heap: str 
  13. ./test2.go:9:12: main ... argument does not escape 

這回str也逃逸到了堆上,在堆上進行內存分配,這是因為我們訪問str的地址,因為入參是interface類型,所以變量str的地址以實參的形式傳入fmt.Printf后被裝箱到一個interface{}形參變量中,裝箱的形參變量的值要在堆上分配,但是還要存儲一個棧上的地址,也就是str的地址,堆上的對象不能存儲一個棧上的地址,所以str也逃逸到堆上,在堆上分配內存。(這里注意一個知識點:Go語言的參數傳遞只有值傳遞)

3. 閉包產生的逃逸

  1. func Increase() func() int { 
  2.  n := 0 
  3.  return func() int { 
  4.   n++ 
  5.   return n 
  6.  } 
  7.  
  8. func main() { 
  9.  in := Increase() 
  10.  fmt.Println(in()) // 1 

查看逃逸分析結果:

  1. go build -gcflags="-m -m -l" ./test3.go 
  2. # command-line-arguments 
  3. ./test3.go:10:3: Increase.func1 capturing by ref: n (addr=true assign=true width=8) 
  4. ./test3.go:9:9: func literal escapes to heap 
  5. ./test3.go:9:9:         from ~r0 (assigned) at ./test3.go:7:17 
  6. ./test3.go:9:9: func literal escapes to heap 
  7. ./test3.go:9:9:         from &(func literal) (address-ofat ./test3.go:9:9 
  8. ./test3.go:9:9:         from ~r0 (assigned) at ./test3.go:7:17 
  9. ./test3.go:10:3: &n escapes to heap 
  10. ./test3.go:10:3:        from func literal (captured by a closure) at ./test3.go:9:9 
  11. ./test3.go:10:3:        from &(func literal) (address-ofat ./test3.go:9:9 
  12. ./test3.go:10:3:        from ~r0 (assigned) at ./test3.go:7:17 
  13. ./test3.go:8:2: moved to heap: n 
  14. ./test3.go:17:16: in() escapes to heap 
  15. ./test3.go:17:16:       from ... argument (arg to ...) at ./test3.go:17:13 
  16. ./test3.go:17:16:       from *(... argument) (indirection) at ./test3.go:17:13 
  17. ./test3.go:17:16:       from ... argument (passed to call[argument content escapes]) at ./test3.go:17:13 
  18. ./test3.go:17:13: main ... argument does not escape 

因為函數也是一個指針類型,所以匿名函數當作返回值時也發生了逃逸,在匿名函數中使用外部變量n,這個變量n會一直存在直到in被銷毀,所以n變量逃逸到了堆上。

4. 變量大小不確定及棧空間不足引發逃逸

我們先使用ulimit -a查看操作系統的棧空間:

  1. ulimit -a 
  2. -t: cpu time (seconds)              unlimited 
  3. -f: file size (blocks)              unlimited 
  4. -d: data seg size (kbytes)          unlimited 
  5. -s: stack size (kbytes)             8192 
  6. -c: core file size (blocks)         0 
  7. -v: address space (kbytes)          unlimited 
  8. -l: locked-in-memory size (kbytes)  unlimited 
  9. -u: processes                       2784 
  10. -n: file descriptors                256 

我的電腦的棧空間大小是8192,所以根據這個我們寫一個測試用例:

  1. package main 
  2.  
  3. import ( 
  4.  "math/rand" 
  5.  
  6. func LessThan8192()  { 
  7.  nums := make([]int, 100) // = 64KB 
  8.  for i := 0; i < len(nums); i++ { 
  9.   nums[i] = rand.Int() 
  10.  } 
  11.  
  12.  
  13. func MoreThan8192(){ 
  14.  nums := make([]int, 1000000) // = 64KB 
  15.  for i := 0; i < len(nums); i++ { 
  16.   nums[i] = rand.Int() 
  17.  } 
  18.  
  19.  
  20. func NonConstant() { 
  21.  number := 10 
  22.  s := make([]int, number) 
  23.  for i := 0; i < len(s); i++ { 
  24.   s[i] = i 
  25.  } 
  26.  
  27. func main() { 
  28.  NonConstant() 
  29.  MoreThan8192() 
  30.  LessThan8192() 

查看逃逸分析結果:

  1. go build -gcflags="-m -m -l" ./test4.go 
  2. # command-line-arguments 
  3. ./test4.go:8:14: LessThan8192 make([]int, 100) does not escape 
  4. ./test4.go:16:14: make([]int, 1000000) escapes to heap 
  5. ./test4.go:16:14:       from make([]int, 1000000) (non-constant sizeat ./test4.go:16:14 
  6. ./test4.go:25:11: make([]int, number) escapes to heap 
  7. ./test4.go:25:11:       from make([]int, number) (non-constant sizeat ./test4.go:25:11 

我們可以看到,當棧空間足夠時,不會發生逃逸,但是當變量過大時,已經完全超過棧空間的大小時,將會發生逃逸到堆上分配內存。

同樣當我們初始化切片時,沒有直接指定大小,而是填入的變量,這種情況為了保證內存的安全,編譯器也會觸發逃逸,在堆上進行分配內存。

參考文章(建議大家閱讀一遍)

  • https://driverzhang.github.io/post/golang%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E9%80%83%E9%80%B8%E5%88%86%E6%9E%90/
  • https://segmentfault.com/a/1190000039843497
  • https://tonybai.com/2021/05/24/understand-go-escape-analysis-by-example/
  • https://cloud.tencent.com/developer/article/1732263
  • https://geektutu.com/post/hpg-escape-analysis.html

總結

本文到這里結束了,這篇文章我們一起分析了什么是內存逃逸以及Go語言中的逃逸分析,上面只列舉了幾個例子,因為發生的逃逸的情況是列舉不全的,我們只需要了解什么是逃逸分析,了解逃逸的策略就可以了,后面在實戰中可以根據具體代碼具體分析,寫出更優質的代碼。

最后對逃逸做一個總結: 

  • 逃逸分析在編譯階段確定哪些變量可以分配在棧中,哪些變量分配在堆上
  • 逃逸分析減輕了GC壓力,提高程序的運行速度
  • 棧上內存使用完畢不需要GC處理,堆上內存使用完畢會交給GC處理
  • 函數傳參時對于需要修改原對象值,或占用內存比較大的結構體,選擇傳指針。對于只讀的占用內存較小的結構體,直接傳值能夠獲得更好的性能
  • 根據代碼具體分析,盡量減少逃逸代碼,減輕GC壓力,提高性能

 

責任編輯:武曉燕 來源: Golang夢工廠
相關推薦

2020-06-28 09:30:37

Linux內存操作系統

2019-03-21 11:04:22

安全標準信息

2021-04-20 08:40:11

內存管理Lwip

2022-05-12 23:19:15

Redis內存碎片處理

2023-03-06 21:23:23

Redis數據庫

2019-03-20 14:29:46

Linux虛擬內存

2022-05-18 16:35:43

Redis內存運維

2022-09-19 16:24:33

數據可視化Matplotlib工具

2022-10-19 15:20:58

pandas數據處理庫技巧

2023-02-09 08:48:47

Java虛擬機

2022-10-21 07:59:17

CSS滾動文字特效

2018-06-07 13:17:12

契約測試單元測試API測試

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2023-03-03 12:37:50

JavaJVM內存溢出

2023-07-06 13:56:14

微軟Skype

2021-02-06 08:34:49

函數memoize文檔

2022-11-01 08:46:20

責任鏈模式對象

2021-01-29 08:32:21

數據結構數組
點贊
收藏

51CTO技術棧公眾號

黑人巨大亚洲一区二区久| www.久久久久久| 精品一区二区三| 91麻豆精品91久久久久同性| 日韩视频一二三| 丰满人妻一区二区三区免费视频| 老鸭窝毛片一区二区三区| 国产亚洲视频在线观看| 深夜做爰性大片蜜桃| 日本乱码一区二区三区不卡| 国产精品乱码妇女bbbb| 国产不卡一区二区三区在线观看| 亚洲图片在线视频| 精品久久美女| 亚洲成年人在线| 中日韩av在线播放| 欧美日韩国产观看视频| 综合网在线视频| 欧美重口乱码一区二区| 成人av手机在线| 男男成人高潮片免费网站| 国内精品模特av私拍在线观看| 最新中文字幕av| 国产精品网在线观看| 欧美精品久久一区| 韩国一区二区av| 岛国av免费在线观看| 国产精品久久午夜| 欧美综合激情| 天堂av中文在线资源库| 国产精品一区二区不卡| 国产精品一区二区久久久久| 亚洲另类在线观看| 精品动漫一区| 欧美激情a在线| 欧美一级特黄高清视频| 精品久久精品| 亚洲系列中文字幕| 精品夜夜澡人妻无码av| 大型av综合网站| 日韩女同互慰一区二区| 九九九九九九九九| 热久久久久久| 欧美女孩性生活视频| 热久久精品免费视频| 波多野结衣久久精品| 午夜精品久久久久久久久| 男人日女人的bb| 18+激情视频在线| 日韩美女精品在线| 中文字幕免费高| 免费在线看a| 亚洲手机成人高清视频| 中文字幕一区二区三区乱码| 麻豆网站在线看| 亚洲天堂中文字幕| 99re99热| 中国av在线播放| 一区二区视频在线| 久操手机在线视频| 丰满的护士2在线观看高清| 一区二区三区精品久久久| 欧美日韩午夜爽爽| 金瓶狂野欧美性猛交xxxx| 亚洲最新视频在线播放| 日韩a级在线观看| 麻豆视频在线看| 色综合久久久久| 激情 小说 亚洲 图片: 伦| 成人精品国产亚洲| 91精品国产一区二区三区| 在线观看一区二区三区视频| 国内自拍欧美| 欧美精品一区二区久久婷婷| 午夜一区二区三区免费| 精品一区二区三区的国产在线观看| www国产精品com| 欧美精品久久久久性色| 国产日韩欧美一区在线| 国产精品成人免费电影| 国产丝袜视频在线观看| www.亚洲在线| 日韩三级电影| 91精选在线| 精品美女国产在线| 中文字幕国产传媒| 日韩欧美激情电影| 日韩精品视频在线免费观看| 波多野结衣家庭教师在线观看| 中文字幕一区二区三区乱码图片 | 国产99re66在线视频| 欧美日韩国产专区| 国产一级片自拍| 国产成人福利av| 中文字幕精品久久久久| 欧美日韩一级大片| 久久久国产亚洲精品| 成人欧美在线观看| 无码精品一区二区三区在线 | 亚洲欧美国产一本综合首页| 久久av红桃一区二区禁漫| 亚洲精品日本| 成人午夜高潮视频| 日本一级在线观看| 亚洲精品免费播放| www.涩涩涩| 精品欠久久久中文字幕加勒比| 永久免费精品影视网站| 久久精品久久精品久久| 久久国产夜色精品鲁鲁99| 国产一区二区自拍| 午夜视频在线看| 欧美视频国产精品| 肉丝美足丝袜一区二区三区四| 精品国产一区一区二区三亚瑟| 隔壁老王国产在线精品| 国产乱码精品一区二区三区精东| 久久嫩草精品久久久精品一| 国产日韩亚洲欧美在线| 2019中文亚洲字幕| 尤物99国产成人精品视频| 99热在线观看免费精品| 国产99久久久国产精品免费看| 午夜精品一区二区在线观看 | 午夜男人的天堂| 性欧美69xoxoxoxo| 国产精品美女久久久免费| 偷拍25位美女撒尿视频在线观看| 一区二区三区欧美日| 91极品视频在线观看| 久久成人av| 午夜精品久久久久久久久久久久| 国产av无码专区亚洲av| 国产精品免费丝袜| 亚洲综合在线网站| 香蕉视频一区二区三区| 性欧美长视频免费观看不卡| 亚洲国产精品成人久久蜜臀| 亚洲免费av在线| 中文字幕日韩综合| 爽成人777777婷婷| 国产区精品视频| 日本在线免费| 欧美精品在线观看一区二区| 影音先锋男人看片资源| 日本不卡一区二区三区 | 色婷婷免费视频| 亚洲精品1234| 国产一区二区三区四区五区加勒比| 五月花成人网| 精品国产电影一区二区| 精品无码久久久久| 成人sese在线| 亚洲自偷自拍熟女另类| 欧美性生活一级片| 欧美最顶级的aⅴ艳星| 免费a在线观看| 在线视频中文字幕一区二区| 蜜桃av免费在线观看| 久久精品99国产精品| 日韩一级特黄毛片| 北条麻妃在线一区二区免费播放 | 欧美亚洲大片| 一本色道久久综合亚洲精品小说| 亚洲中文无码av在线| 国产精品欧美一区二区三区| 在线视频观看一区二区| 午夜精品久久久久99热蜜桃导演| 国产经典一区二区三区| 秋霞伦理一区| 日韩在线视频网| 国产成人三级一区二区在线观看一| 一区二区三区91| 网站免费在线观看| 日本美女一区二区三区视频| gogogo免费高清日本写真| 草莓视频一区二区三区| 国产91精品高潮白浆喷水| 国产有码在线| 欧美一卡在线观看| 日本一二三区视频| 国产亚洲va综合人人澡精品| 亚洲精品综合在线观看| 亚洲性色视频| 视频一区二区三区在线观看| 亚洲1区在线| 欧美自拍视频在线| 黄在线免费观看| 日韩av影视在线| 亚洲自拍第二页| 亚洲一本大道在线| 午夜在线观看一区| 国产精品一区二区黑丝| 国产精品99久久免费黑人人妻| 国产精品久久久久久久免费观看| 国产另类自拍| 国产激情欧美| 91av视频在线播放| 日韩在线观看www| 日韩av中文字幕在线免费观看| 一级黄色片网站| 天天影视色香欲综合网老头| 懂色av蜜臀av粉嫩av永久| eeuss国产一区二区三区| 免费看涩涩视频| 亚洲深夜福利| 国产 欧美 日本| 日韩欧美二区| 欧美日韩一区二区视频在线| 一区二区三区视频播放| 国产精品免费小视频| caoporn视频在线| 久久国产精彩视频| 国产高清视频免费最新在线| 亚洲成人黄色在线| 国产999久久久| 69av一区二区三区| 中文字幕在线日本| 婷婷开心激情综合| 日韩欧美中文字幕视频| 中文字幕一区二区三区色视频| 男生裸体视频网站| 大陆成人av片| 麻豆精品国产传媒| 久久国产剧场电影| 亚欧在线免费观看| 久久在线精品| 日本wwww视频| av成人国产| 国产伦精品一区二区三区四区视频_| 97精品中文字幕| 先锋在线资源一区二区三区| 欧美激情在线精品一区二区三区| 久久国产一区二区| 韩国女主播一区二区三区| 91网免费观看| 日韩成人在线观看视频| 92裸体在线视频网站| 99久久999| 成人黄在线观看| japansex久久高清精品| 成人欧美一区二区三区在线| 91嫩草国产线观看亚洲一区二区| 91精品国产综合久久香蕉的用户体验| 日本美女久久| 国产精品人成电影在线观看| 国产91亚洲精品久久久| 国产精品福利网站| 成人做爰视频www| 国产精品久久久久高潮| 精品自拍视频| 成人午夜高潮视频| 亚洲一区网址| 极品日韩久久| 深爱激情久久| 亚洲欧美日韩精品在线| 久久久久电影| 国产精品视频二| 日韩天堂av| 日本www高清视频| 久久精品国产第一区二区三区| 欧美美女性视频| 国产很黄免费观看久久| 制服丝袜av在线| 久久综合久久综合亚洲| 亚洲一区二区自偷自拍| 专区另类欧美日韩| 国产精品23p| 日本韩国欧美国产| 一区二区国产欧美| 欧美一区二区三区公司| 黄色小视频免费在线观看| 日韩成人中文电影| 992tv免费直播在线观看| 久久精品国产清自在天天线| 精灵使的剑舞无删减版在线观看| 欧美一区二区三区免费观看| 国产毛片精品久久| 99视频免费观看| 亚洲精华一区二区三区| 亚洲国产精品日韩| 女人香蕉久久**毛片精品| 777精品久无码人妻蜜桃| 日本一区中文字幕| japan高清日本乱xxxxx| 99精品久久只有精品| 一本色道久久88| 亚洲国产一区视频| 超碰在线观看91| 精品日产卡一卡二卡麻豆| 国产三级电影在线观看| 久久国产精品久久久久久| 伊伊综合在线| 亚洲综合第一页| 国产一区二区三区四区二区 | 男女精品网站| 欧美国产在线一区| 久久久久久久久久久久久夜| xxxx日本少妇| 色嗨嗨av一区二区三区| 国产刺激高潮av| 精品国内自产拍在线观看| 中文字幕乱码中文乱码51精品 | 卡通动漫精品一区二区三区| 一区二区三区|亚洲午夜| 国产精品一区毛片| 波多野结衣免费观看| 国产日本亚洲高清| 日韩xxxxxxxxx| 日韩欧美综合在线| av资源网在线观看| 国产91精品久久久久| 99热这里只有精品首页| 手机在线视频你懂的| 日本欧美一区二区| 一女三黑人理论片在线| 一个色综合av| 国产精品福利电影| 国产一区二区三区在线观看网站 | av网站在线免费看推荐| 国产精品日韩欧美| 国产成人1区| 欧美 日韩 国产在线观看| 国产激情视频一区二区在线观看| 亚洲色图日韩精品| 91官网在线免费观看| 人人九九精品| 91成人精品网站| 久草精品视频| 天堂…中文在线最新版在线| 成人自拍视频在线| 久久久全国免费视频| 日韩一区二区三区四区| 免费高清完整在线观看| 国产精品一区二区久久国产| 日本精品黄色| 日本在线观看免费视频| 欧美国产成人精品| 日韩免费av网站| 亚洲色无码播放| 另类专区亚洲| 日韩精品久久一区二区三区| 老司机精品福利视频| 色婷婷av777| 色狠狠一区二区三区香蕉| 久草视频视频在线播放| 国产aaa精品| 精品99久久| 孩娇小videos精品| 国产精品色呦呦| 97在线公开视频| 欧美高清videos高潮hd| www.丝袜精品| 日韩 欧美 高清| 国产欧美视频一区二区| 亚洲视频中文字幕在线观看| 日日狠狠久久偷偷四色综合免费| 一区二区三区无毛| 国产资源第一页| 成人av在线观| 依依成人综合网| 自拍偷拍亚洲一区| 成人在线分类| 久久艹国产精品| 91网上在线视频| 中国a一片一级一片| 久久精品国产清自在天天线| 7m精品国产导航在线| 成人av一级片| 亚洲国产成人自拍| jizz中国少妇| 国产91成人video| 欧美电影《睫毛膏》| 亚洲丝袜在线观看| 精品国产鲁一鲁一区二区张丽 | www.五月天激情| 欧美性一区二区三区| 色喇叭免费久久综合网| 风韵丰满熟妇啪啪区老熟熟女| 欧美午夜久久久| 麻豆传媒在线免费| 精品乱码一区二区三区| 麻豆国产精品官网| 久久久夜色精品| 伊人伊成久久人综合网小说| 深夜激情久久| 韩国日本美国免费毛片| 亚洲视频在线一区观看| 天天色棕合合合合合合合| 国产日产久久高清欧美一区| 欧美日一区二区在线观看 | 日批视频在线看| 91福利精品视频| 欧美精品videossex少妇| 人偷久久久久久久偷女厕| 激情文学综合丁香| 香蕉影院在线观看| 久久国产精品久久精品| 菠萝蜜一区二区| 亚洲啪av永久无码精品放毛片|