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

淺談PHP 5中垃圾回收算法的演化

開(kāi)發(fā) 前端 后端 算法
本文將分別討論P(yáng)HP5.2和PHP5.3的垃圾回收機(jī)制,并討論這種演化和改進(jìn)對(duì)于程序員編寫(xiě)PHP的影響以及要注意的問(wèn)題。

PHP是一門(mén)托管型語(yǔ)言,在PHP編程中程序員不需要手工處理內(nèi)存資源的分配與釋放(使用C編寫(xiě)PHP或Zend擴(kuò)展除外),這就意味著PHP本身實(shí)現(xiàn)了垃圾回收機(jī)制(Garbage Collection)。現(xiàn)在如果去PHP官方網(wǎng)站(php.net)可以看到,目前PHP5的兩個(gè)分支版本PHP5.2和PHP5.3是分別更新的,這是因?yàn)樵S多項(xiàng)目仍然使用5.2版本的PHP,而5.3版本對(duì)5.2并不是完全兼容。PHP5.3在PHP5.2的基礎(chǔ)上做了諸多改進(jìn),其中垃圾回收算法就屬于一個(gè)比較大的改變。本文將分別討論P(yáng)HP5.2和PHP5.3的垃圾回收機(jī)制,并討論這種演化和改進(jìn)對(duì)于程序員編寫(xiě)PHP的影響以及要注意的問(wèn)題。

PHP變量及關(guān)聯(lián)內(nèi)存對(duì)象的內(nèi)部表示

垃圾回收說(shuō)到底是對(duì)變量及其所關(guān)聯(lián)內(nèi)存對(duì)象的操作,所以在討論P(yáng)HP的垃圾回收機(jī)制之前,先簡(jiǎn)要介紹PHP中變量及其內(nèi)存對(duì)象的內(nèi)部表示(其C源代碼中的表示)。

PHP官方文檔中將PHP中的變量劃分為兩類(lèi):標(biāo)量類(lèi)型和復(fù)雜類(lèi)型。標(biāo)量類(lèi)型包括布爾型、整型、浮點(diǎn)型和字符串;復(fù)雜類(lèi)型包括數(shù)組、對(duì)象和資源;還有一個(gè)NULL比較特殊,它不劃分為任何類(lèi)型,而是單獨(dú)成為一類(lèi)。

所有這些類(lèi)型,在PHP內(nèi)部統(tǒng)一用一個(gè)叫做zval的結(jié)構(gòu)表示,在PHP源代碼中這個(gè)結(jié)構(gòu)名稱(chēng)為“_zval_struct”。zval的具體定義在PHP源代碼的“Zend/zend.h”文件中,下面是相關(guān)代碼的摘錄。

  1. typedef union _zvalue_value {  
  2.     long lval;                  /* long value */ 
  3.     double dval;                /* double value */ 
  4.     struct {  
  5.         char *val;  
  6.         int len;  
  7.     } str;  
  8.     HashTable *ht;              /* hash table value */ 
  9.     zend_object_value obj;  
  10. } zvalue_value;  
  11.  
  12. struct _zval_struct {  
  13.     /* Variable information */ 
  14.     zvalue_value value;       
  15. /* value */ 
  16.     zend_uint refcount__gc;  
  17.     zend_uchar type;    /* active type */ 
  18.     zend_uchar is_ref__gc;  
  19. }; 

其中聯(lián)合體“_zvalue_value”用于表示PHP中所有變量的值,這里之所以使用union,是因?yàn)橐粋€(gè)zval在一個(gè)時(shí)刻只能表示一種類(lèi)型的變量。可以看到_zvalue_value中只有5個(gè)字段,但是PHP中算上NULL有8種數(shù)據(jù)類(lèi)型,那么PHP內(nèi)部是如何用5個(gè)字段表示8種類(lèi)型呢?這算是PHP設(shè)計(jì)比較巧妙的一個(gè)地方,它通過(guò)復(fù)用字段達(dá)到了減少字段的目的。例如,在PHP內(nèi)部布爾型、整型及資源(只要存儲(chǔ)資源的標(biāo)識(shí)符即可)都是通過(guò)lval字段存儲(chǔ)的;dval用于存儲(chǔ)浮點(diǎn)型;str存儲(chǔ)字符串;ht存儲(chǔ)數(shù)組(注意PHP中的數(shù)組其實(shí)是哈希表);而obj存儲(chǔ)對(duì)象類(lèi)型;如果所有字段全部置為0或NULL則表示PHP中的NULL,這樣就達(dá)到了用5個(gè)字段存儲(chǔ)8種類(lèi)型的值。

而當(dāng)前zval中的value(value的類(lèi)型即是_zvalue_value)到底表示那種類(lèi)型,則由“_zval_struct”中的type確定。_zval_struct即是zval在C語(yǔ)言中的具體實(shí)現(xiàn),每個(gè)zval表示一個(gè)變量的內(nèi)存對(duì)象。除了value和type,可以看到_zval_struct中還有兩個(gè)字段refcount__gc和is_ref__gc,從其后綴就可以斷定這兩個(gè)家伙與垃圾回收有關(guān)。沒(méi)錯(cuò),PHP的垃圾回收全靠這倆字段了。其中refcount__gc表示當(dāng)前有幾個(gè)變量引用此zval,而is_ref__gc表示當(dāng)前zval是否被按引用引用,這話聽(tīng)起來(lái)很拗口,這和PHP中zval的“Write-On-Copy”機(jī)制有關(guān),由于這個(gè)話題不是本文重點(diǎn),因此這里不再詳述,讀者只需記住refcount__gc這個(gè)字段的作用即可。

PHP5.2中的垃圾回收算法——Reference Counting

PHP5.2中使用的內(nèi)存回收算法是大名鼎鼎的Reference Counting,這個(gè)算法中文翻譯叫做“引用計(jì)數(shù)”,其思想非常直觀和簡(jiǎn)潔:為每個(gè)內(nèi)存對(duì)象分配一個(gè)計(jì)數(shù)器,當(dāng)一個(gè)內(nèi)存對(duì)象建立時(shí)計(jì)數(shù)器初始化為1(因此此時(shí)總是有一個(gè)變量引用此對(duì)象),以后每有一個(gè)新變量引用此內(nèi)存對(duì)象,則計(jì)數(shù)器加1,而每當(dāng)減少一個(gè)引用此內(nèi)存對(duì)象的變量則計(jì)數(shù)器減1,當(dāng)垃圾回收機(jī)制運(yùn)作的時(shí)候,將所有計(jì)數(shù)器為0的內(nèi)存對(duì)象銷(xiāo)毀并回收其占用的內(nèi)存。而PHP中內(nèi)存對(duì)象就是zval,而計(jì)數(shù)器就是refcount__gc。

例如下面一段PHP代碼演示了PHP5.2計(jì)數(shù)器的工作原理(計(jì)數(shù)器值通過(guò)xdebug得到):

  1. <?php  
  2.  
  3. $val1 = 100; //zval(val1).refcount_gc = 1;  
  4. $val2 = $val1//zval(val1).refcount_gc = 2,zval(val2).refcount_gc = 2(因?yàn)槭荳rite on copy,當(dāng)前val2與val1共同引用一個(gè)zval)  
  5. $val2 = 200; //zval(val1).refcount_gc = 1,zval(val2).refcount_gc = 1(此處val2新建了一個(gè)zval)  
  6. unset($val1); //zval(val1).refcount_gc = 0($val1引用的zval再也不可用,會(huì)被GC回收)  
  7.  
  8. ?> 

Reference Counting簡(jiǎn)單直觀,實(shí)現(xiàn)方便,但卻存在一個(gè)致命的缺陷,就是容易造成內(nèi)存泄露。很多朋友可能已經(jīng)意識(shí)到了,如果存在循環(huán)引用,那么Reference Counting就可能導(dǎo)致內(nèi)存泄露。例如下面的代碼:

  1. <?php  
  2.  
  3. $a = array();  
  4. $a[] = & $a;  
  5. unset($a);  
  6.  
  7. ?> 

這段代碼首先建立了數(shù)組a,然后讓a的第一個(gè)元素按引用指向a,這時(shí)a的zval的refcount就變?yōu)?,然后我們銷(xiāo)毀變量a,此時(shí)a最初指向的zval的refcount為1,但是我們?cè)僖矝](méi)有辦法對(duì)其進(jìn)行操作,因?yàn)槠湫纬闪艘粋€(gè)循環(huán)自引用,如下圖所示:

淺談PHP5中垃圾回收算法(Garbage Collection)的演化

其中灰色部分表示已經(jīng)不復(fù)存在。由于a之前指向的zval的refcount為1(被其HashTable的第一個(gè)元素引用),這個(gè)zval就不會(huì)被GC銷(xiāo)毀,這部分內(nèi)存就泄露了。

這里特別要指出的是,PHP是通過(guò)符號(hào)表(Symbol Table)存儲(chǔ)變量符號(hào)的,全局有一個(gè)符號(hào)表,而每個(gè)復(fù)雜類(lèi)型如數(shù)組或?qū)ο笥凶约旱姆?hào)表,因此上面代碼中,a和a[0]是兩個(gè)符號(hào),但是a儲(chǔ)存在全局符號(hào)表中,而a[0]儲(chǔ)存在數(shù)組本身的符號(hào)表中,且這里a和a[0]引用同一個(gè)zval(當(dāng)然符號(hào)a后來(lái)被銷(xiāo)毀了)。希望讀者朋友注意分清符號(hào)(Symbol)的zval的關(guān)系。

在PHP只用于做動(dòng)態(tài)頁(yè)面腳本時(shí),這種泄露也許不是很要緊,因?yàn)閯?dòng)態(tài)頁(yè)面腳本的生命周期很短,PHP會(huì)保證當(dāng)腳本執(zhí)行完畢后,釋放其所有資源。但是PHP發(fā)展到目前已經(jīng)不僅僅用作動(dòng)態(tài)頁(yè)面腳本這么簡(jiǎn)單,如果將PHP用在生命周期較長(zhǎng)的場(chǎng)景中,例如自動(dòng)化測(cè)試腳本或deamon進(jìn)程,那么經(jīng)過(guò)多次循環(huán)后積累下來(lái)的內(nèi)存泄露可能就會(huì)很?chē)?yán)重。這并不是我在聳人聽(tīng)聞,我曾經(jīng)實(shí)習(xí)過(guò)的一個(gè)公司就通過(guò)PHP寫(xiě)的deamon進(jìn)程來(lái)與數(shù)據(jù)存儲(chǔ)服務(wù)器交互。

由于Reference Counting的這個(gè)缺陷,PHP5.3改進(jìn)了垃圾回收算法。

PHP5.3中的垃圾回收算法——Concurrent Cycle Collection in Reference Counted Systems

PHP5.3的垃圾回收算法仍然以引用計(jì)數(shù)為基礎(chǔ),但是不再是使用簡(jiǎn)單計(jì)數(shù)作為回收準(zhǔn)則,而是使用了一種同步回收算法,這個(gè)算法由IBM的工程師在論文Concurrent Cycle Collection in Reference Counted Systems中提出。

這個(gè)算法可謂相當(dāng)復(fù)雜,從論文29頁(yè)的數(shù)量我想大家也能看出來(lái),所以我不打算(也沒(méi)有能力)完整論述此算法,有興趣的朋友可以閱讀上面的提到的論文(強(qiáng)烈推薦,這篇論文非常精彩)。

我在這里,只能大體描述一下此算法的基本思想。

首先PHP會(huì)分配一個(gè)固定大小的“根緩沖區(qū)”,這個(gè)緩沖區(qū)用于存放固定數(shù)量的zval,這個(gè)數(shù)量默認(rèn)是10,000,如果需要修改則需要修改源代碼Zend/zend_gc.c中的常量GC_ROOT_BUFFER_MAX_ENTRIES然后重新編譯。

由上文我們可以知道,一個(gè)zval如果有引用,要么被全局符號(hào)表中的符號(hào)引用,要么被其它表示復(fù)雜類(lèi)型的zval中的符號(hào)引用。因此在zval中存在一些可能根(root)。這里我們暫且不討論P(yáng)HP是如何發(fā)現(xiàn)這些可能根的,這是個(gè)很復(fù)雜的問(wèn)題,總之PHP有辦法發(fā)現(xiàn)這些可能根zval并將它們投入根緩沖區(qū)。

當(dāng)根緩沖區(qū)滿額時(shí),PHP就會(huì)執(zhí)行垃圾回收,此回收算法如下:

1、對(duì)每個(gè)根緩沖區(qū)中的根zval按照深度優(yōu)先遍歷算法遍歷所有能遍歷到的zval,并將每個(gè)zval的refcount減1,同時(shí)為了避免對(duì)同一zval多次減1(因?yàn)榭赡懿煌母鼙闅v到同一個(gè)zval),每次對(duì)某個(gè)zval減1后就對(duì)其標(biāo)記為“已減”。

2、再次對(duì)每個(gè)緩沖區(qū)中的根zval深度優(yōu)先遍歷,如果某個(gè)zval的refcount不為0,則對(duì)其加1,否則保持其為0。

3、清空根緩沖區(qū)中的所有根(注意是把這些zval從緩沖區(qū)中清除而不是銷(xiāo)毀它們),然后銷(xiāo)毀所有refcount為0的zval,并收回其內(nèi)存。

如果不能完全理解也沒(méi)有關(guān)系,只需記住PHP5.3的垃圾回收算法有以下幾點(diǎn)特性:

1、并不是每次refcount減少時(shí)都進(jìn)入回收周期,只有根緩沖區(qū)滿額后在開(kāi)始垃圾回收。

2、可以解決循環(huán)引用問(wèn)題。

3、可以總將內(nèi)存泄露保持在一個(gè)閾值以下。

PHP5.2與PHP5.3垃圾回收算法的性能比較

由于我目前條件所限,我就不重新設(shè)計(jì)試驗(yàn)了,而是直接引用PHP Manual中的實(shí)驗(yàn),關(guān)于兩者的性能比較請(qǐng)參考PHP Manual中的相關(guān)章節(jié):http://www.php.net/manual/en/features.gc.performance-considerations.php。

首先是內(nèi)存泄露試驗(yàn),下面直接引用PHP Manual中的實(shí)驗(yàn)代碼和試驗(yàn)結(jié)果圖:

  1. <?php  
  2. class Foo  
  3. {  
  4.     public $var = '3.1415962654';  
  5. }  
  6.  
  7. $baseMemory = memory_get_usage();  
  8.  
  9. for ( $i = 0; $i <= 100000; $i++ )  
  10. {  
  11.     $a = new Foo;  
  12.     $a->self = $a;  
  13.     if ( $i % 500 === 0 )  
  14.     {  
  15.         echo sprintf( '%8d: '$i ), memory_get_usage() - $baseMemory"\n";  
  16.     }  
  17. }  
  18. ?> 

 

PHP

可以看到在可能引發(fā)累積性內(nèi)存泄露的場(chǎng)景下,PHP5.2發(fā)生持續(xù)累積性內(nèi)存泄露,而PHP5.3則總能將內(nèi)存泄露控制在一個(gè)閾值以下(與根緩沖區(qū)大小有關(guān))。

另外是關(guān)于性能方面的對(duì)比:

  1. <?php  
  2. class Foo  
  3. {  
  4.     public $var = '3.1415962654';  
  5. }  
  6.  
  7. for ( $i = 0; $i <= 1000000; $i++ )  
  8. {  
  9.     $a = new Foo;  
  10.     $a->self = $a;  
  11. }  
  12.  
  13. echo memory_get_peak_usage(), "\n";  
  14. ?> 

這個(gè)腳本執(zhí)行1000000次循環(huán),使得延遲時(shí)間足夠進(jìn)行對(duì)比。

然后使用CLI方式分別在打開(kāi)內(nèi)存回收和關(guān)閉內(nèi)存回收的的情況下運(yùn)行此腳本:

  1. time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php  
  2. and 
  3. time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php 

在我的機(jī)器環(huán)境下,運(yùn)行時(shí)間分別為6.4s和7.2s,可以看到PHP5.3的垃圾回收機(jī)制會(huì)慢一些,但是影響并不大。

與垃圾回收算法相關(guān)的PHP配置

可以通過(guò)修改php.ini中的zend.enable_gc來(lái)打開(kāi)或關(guān)閉PHP的垃圾回收機(jī)制,也可以通過(guò)調(diào)用gc_enable()或gc_disable()打開(kāi)或關(guān)閉PHP的垃圾回收機(jī)制。在PHP5.3中即使關(guān)閉了垃圾回收機(jī)制,PHP仍然會(huì)記錄可能根到根緩沖區(qū),只是當(dāng)根緩沖區(qū)滿額時(shí),PHP不會(huì)自動(dòng)運(yùn)行垃圾回收,當(dāng)然,任何時(shí)候您都可以通過(guò)手工調(diào)用gc_collect_cycles()函數(shù)強(qiáng)制執(zhí)行內(nèi)存回收。

原文鏈接:http://www.cnblogs.com/leoo2sk/archive/2011/02/27/php-gc.html

【編輯推薦】

  1. 25個(gè)不錯(cuò)PHP的游戲編程腳本代碼分享
  2. PHP企業(yè)級(jí)應(yīng)用之常見(jiàn)緩存技術(shù)深入解讀
  3. PHP與Java在Web開(kāi)發(fā)方面的比較
  4. 40個(gè)跡象表明你還是PHP菜鳥(niǎo)
  5. PHP程序設(shè)計(jì)最佳實(shí)踐
責(zé)任編輯:陳貽新 來(lái)源: 張洋的博客
相關(guān)推薦

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2010-12-13 11:14:04

Java垃圾回收算法

2020-07-09 08:26:42

Kubernetes容器開(kāi)發(fā)

2017-03-03 09:26:48

PHP垃圾回收機(jī)制

2021-11-05 15:23:20

JVM回收算法

2009-12-25 16:15:31

JVM垃圾回收算法

2025-01-06 08:22:41

2017-10-12 12:41:11

PHP圾回收機(jī)制變量容器

2017-06-12 17:38:32

Python垃圾回收引用

2009-12-09 17:28:34

PHP垃圾回收機(jī)制

2021-01-04 10:08:07

垃圾回收Java虛擬機(jī)

2019-12-02 16:23:03

Python編程語(yǔ)言“垃圾”回收

2012-01-09 16:53:36

JavaJVM

2021-12-02 18:20:25

算法垃圾回收

2021-03-03 08:13:57

模式垃圾回收

2021-02-04 10:43:52

開(kāi)發(fā)技能代碼

2010-09-26 13:29:46

JVM垃圾回收

2010-01-14 11:28:54

JVM分代垃圾回收
點(diǎn)贊
收藏

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

久久综合导航| 国产乱码精品一区二区亚洲| 亚洲免费色视频| 99国产超薄肉色丝袜交足的后果| 99热精品免费| 亚洲国产欧美在线观看| 天天av天天翘天天综合网色鬼国产| 久久99精品久久久久久久久久 | 亚洲人成影院在线观看| 草莓视频一区| 国产在线一级片| 国产精品xvideos88| 日韩激情视频在线播放| 亚洲黄色av片| 深夜在线视频| 亚洲色图欧洲色图| 欧美另类视频在线| 999国产精品视频免费| 老司机一区二区三区| 久久在精品线影院精品国产| 国产精品jizz| 永久免费精品视频| 欧美视频一区二| 欧美黑人经典片免费观看| 欧美成人三区| 99热这里都是精品| 91久久精品国产91性色| 国产精品suv一区| 国模大胆一区二区三区| 在线观看日韩av| 精品无码国产一区二区三区51安| 国产成人a视频高清在线观看| 午夜一区二区三区在线观看| 欧美少妇一级片| 成a人v在线播放| www国产精品av| 国产成人精品一区二区三区福利| 亚洲天堂久久久久| 国产欧美欧美| 欧美极度另类性三渗透| 一起操在线播放| 成人三级视频| 中文字幕一区二区三区电影| 少妇户外露出[11p]| 97久久精品| 日韩精品一区二区三区在线播放| 中文字幕22页| 日韩和一区二区| 欧美国产一级| 中文字幕欧美精品日韩中文字幕| 91中文字幕永久在线| 国内毛片久久| 亚洲国产精品成人一区二区| 久久无码专区国产精品s| 国产一区二区视频在线看| 欧美日韩成人综合| 久久人人爽av| 99精品在线免费观看| 欧美日韩高清一区二区不卡| 亚洲一级免费观看| 免费不卡视频| 国产精品国产三级国产a| 日韩精品一区二区三区丰满| 欧美成人免费| 国产亚洲综合色| 日韩精品国内| 天堂а√在线官网| 国产精品不卡在线观看| 伊甸园精品99久久久久久| 午夜在线小视频| 亚洲欧洲精品一区二区精品久久久 | 不卡在线观看av| 国产一区精品在线| 女人天堂在线| 国产精品久久精品日日| 欧美日韩一级在线| 国产网红在线观看| 精品国产91久久久| 亚洲国产精品毛片av不卡在线| 日本精品在线中文字幕| 欧美日韩www| 精品人妻一区二区乱码| 你懂的在线观看一区二区| 亚洲欧美自拍一区| 国产一区第一页| 国产综合激情| 欧美做受高潮1| 亚洲综合一区中| 国产成人高清视频| 久久久久资源| 日本视频在线播放| 亚洲国产精品天堂| 欧洲一区二区在线| 日p在线观看| 亚洲一区二区三区四区不卡| 久久精品香蕉视频| 国产精品va视频| 日韩激情片免费| 国产成人自拍网站| 国产日韩亚洲欧美精品| 国产精品中文字幕在线观看| a在线观看免费| 久久久高清一区二区三区| 三年中文高清在线观看第6集| 国精产品一区一区三区mba下载| 一本久久精品一区二区| 久久发布国产伦子伦精品| 亚洲免费毛片| 九九九久久久久久| 欧美一级做a爰片免费视频| 国产高清在线观看免费不卡| 精品国产乱码久久久久久蜜柚| seseavlu视频在线| 性做久久久久久免费观看| 九九热精品在线播放| 国产色噜噜噜91在线精品| 色婷婷成人综合| 91精品国产高清一区二区三密臀| 国产高清精品网站| 亚洲欧美成人一区| 亚洲精品福利电影| 精品国产乱码久久久久久牛牛| 青青草自拍偷拍| 国产一区二区你懂的| 亚洲综合自拍一区| 色影院视频在线| 色狠狠色狠狠综合| 国产草草浮力影院| 亚洲午夜av| 91社区国产高清| 在线观看完整版免费| 欧美日韩精品在线观看| 精品久久久久久无码人妻| 外国成人免费视频| 国产美女扒开尿口久久久| 国产一区电影| 狠狠色狠色综合曰曰| 无码国产69精品久久久久网站| 91精品国产自产拍在线观看蜜| 国产精品96久久久久久| 日韩精品一二| 欧美日韩免费网站| 欧美日韩一区二区三区四区五区六区| 亚洲一区二区三区| 国产日韩欧美视频| 欧美极品视频| 欧美精品亚洲二区| 性生交大片免费全黄| 美国欧美日韩国产在线播放| 日韩欧美精品在线不卡| 日韩av首页| 国产亚洲福利一区| 国产九色91回来了| 国产精品嫩草影院av蜜臀| 99热手机在线| 91欧美在线| 亚洲va久久久噜噜噜久久天堂| 欧美精品电影| 日韩欧美国产一区二区在线播放 | 日韩久久精品| 国产精品日韩在线| 亚洲s色大片| 91.com视频| 麻豆国产尤物av尤物在线观看| 国产传媒欧美日韩成人| 可以看毛片的网址| 亚洲aa在线| 国产精品网址在线| 黄a在线观看| 精品欧美乱码久久久久久| 久久综合综合久久| 99久久精品国产精品久久| 欧美 日韩 国产 高清| 免费电影一区二区三区| 国产精品欧美激情| 69成人在线| 亚洲精品久久久久久久久久久久久 | 国产精品18久久久久久首页狼| xxxxx日韩| 日韩三级电影网址| 亚洲精品国产精品乱码| 国产人成亚洲第一网站在线播放| 三上悠亚在线一区二区| 一区二区在线| 久久久久久亚洲精品不卡4k岛国| 国产精品4hu.www| 久久99久久99精品免观看粉嫩| 熟妇高潮一区二区三区| 在线观看不卡视频| 久久久久黄色片| 久久精品一区二区| 欧美又黄又嫩大片a级| 亚洲承认在线| 天堂av一区二区| 九色精品蝌蚪| 清纯唯美亚洲激情| www.在线视频| 亚洲精品中文字幕av| 99久久精品日本一区二区免费| 五月婷婷综合网| 国产真实乱在线更新| 91视频精品在这里| 99精品999| 久久久水蜜桃av免费网站| 四虎4hu永久免费入口| 奇米亚洲欧美| 国产精品久久久对白| 久久精品超碰| 欧美一级电影久久| 在线免费观看a视频| 亚洲网址你懂得| 人妻中文字幕一区| 91精品国产欧美一区二区成人| 91浏览器在线观看| 亚洲男人天堂av| 国产人妻大战黑人20p| 成人av高清在线| 日本黄色一级网站| 国产午夜一区| 99久久伊人精品影院| 成人精品高清在线视频| 久久免费精品视频| av黄色在线| 中文字幕国产精品久久| 亚洲欧洲精品视频| 亚洲成人精品视频| 国产精品亚洲欧美在线播放| 91黄色免费网站| www日韩精品| 亚洲国产aⅴ天堂久久| 国产精品精品软件男同| 国产午夜亚洲精品理论片色戒 | 精品久久久久久久久久久久久久久久| 亚洲精品少妇30p| 国内毛片毛片毛片毛片毛片| 国产亚洲精品中文字幕| 在线天堂www在线国语对白| 国产精品中文字幕欧美| 在线能看的av网站| 日本午夜精品视频在线观看| 日韩av片在线看| 亚洲伦理精品| 人体内射精一区二区三区| 欧美久久成人| 国产91在线亚洲| 综合国产在线| 激情五月五月婷婷| 亚洲网色网站| 乱子伦一区二区| 91成人观看| 成人免费看片视频在线观看| 亚欧美无遮挡hd高清在线视频| 亚洲啪啪av| 久久中文字幕av| 在线免费观看成人网| 91高清一区| 波多野结衣与黑人| 国产精品chinese| www.好吊操| 亚洲专区一区| 青青在线免费观看视频| 视频一区二区欧美| 中文字幕一区二区三区四区在线视频| 日韩av在线发布| 精品日韩久久久| 激情综合亚洲精品| 欧美一级片在线免费观看| 成人午夜电影久久影院| 最近中文字幕无免费| 久久综合精品国产一区二区三区| 黄色正能量网站| 亚洲国产精品传媒在线观看| 午夜激情福利电影| 亚洲精品日韩一| 日韩精品一区三区| 在线精品视频一区二区三四| 亚洲手机在线观看| 精品国产乱码久久久久久1区2区 | 国产卡一卡二在线| 红桃视频欧美| 免费观看日韩毛片| 久久精品国产成人一区二区三区| 亚洲天堂网站在线| 不卡的av中国片| 国产精品免费无码| 综合亚洲深深色噜噜狠狠网站| 久久亚洲AV无码| 一本在线高清不卡dvd| 在线播放亚洲精品| 精品国产第一区二区三区观看体验| 青青久在线视频免费观看| 中文字幕在线亚洲| 国产网红女主播精品视频| 欧美最顶级的aⅴ艳星| 香蕉成人在线| 精品在线一区| 99久久亚洲精品蜜臀| 拔插拔插海外华人免费| 麻豆视频一区二区| 大尺度做爰床戏呻吟舒畅| 久久久www成人免费毛片麻豆| 天天鲁一鲁摸一摸爽一爽| 精品国产乱码久久久久久虫虫漫画| jizz国产在线观看| 日韩一区国产二区欧美三区| 国产在线黄色| 欧美精品电影在线| 国产麻豆一区| 久久久av水蜜桃| 亚洲综合色站| 亚洲色图38p| 成人av影院在线| 手机在线免费看毛片| 一本色道亚洲精品aⅴ| 超碰在线观看av| 最新亚洲国产精品| 欧美gay视频| 国产日韩精品一区观看| 99精品视频在线| 国产一级不卡毛片| 成人av午夜影院| 少妇影院在线观看| 欧美日韩精品一区二区三区| 青青草在线免费视频| 欧美激情一区二区三区久久久| 麻豆久久久久| 日韩电影免费观看高清完整| 亚洲精品精选| 色哟哟网站在线观看| 一区在线观看视频| 国模私拍一区二区| 精品无人区太爽高潮在线播放| 在线看三级电影| 91老司机在线| 99国产精品一区二区| 黄色在线视频网| 国产喷白浆一区二区三区| 日韩无码精品一区二区三区| 日韩西西人体444www| 欧美日本一道| 91精品一区二区| 香蕉综合视频| 五月天视频在线观看| 中文字幕一区在线观看视频| 中文字幕福利视频| 在线精品高清中文字幕| 午夜欧美巨大性欧美巨大| 欧美福利一区二区三区| 亚洲一区二区三区四区五区午夜 | 成人中文字幕视频| av在线com| 国产·精品毛片| 精品爆乳一区二区三区无码av| 91精品在线观看入口| 成年视频在线观看| 亚洲影院高清在线| 中文字幕一区二区三区欧美日韩| 亚洲精品无码久久久久久久| 亚洲免费色视频| 亚洲精品一区二区口爆| 午夜精品久久17c| 欧美国产极品| 韩国一区二区av| 日本一区二区免费在线| 亚洲天堂久久久久| 成年人精品视频| 爱高潮www亚洲精品| 日韩精品xxxx| 久久久久久电影| 亚洲无码精品在线播放| 久久深夜福利免费观看| 一区二区三区四区视频免费观看| 中文精品无码中文字幕无码专区 | 久久视频精品在线观看| 欧美午夜精品免费| 老司机精品影院| 国产精品9999久久久久仙踪林| 亚洲人成免费| 伊人网伊人影院| 制服丝袜亚洲播放| 欧美videosex性极品hd| 久久久水蜜桃| 激情综合网激情| 亚洲天堂视频网站| 中文字幕av一区二区| 999久久久久久久久6666| 欧美丰满熟妇bbbbbb百度| 欧美国产日韩在线观看| 99久久免费国产精精品| 91精品国产91久久久久久最新| 国产一区二区三区四区五区传媒 | xxx欧美精品| 精品国产一区二区三区成人影院| 色诱视频在线观看| 亚洲美女精品一区| 麻豆导航在线观看| 亚洲一区二区三区香蕉 | 日本高清一区二区视频| 亚洲成人手机在线| 在线观看精品一区二区三区|