亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP的垃圾回收機制詳解

2020-03-22 18:34:46
字體:
來源:轉載
供稿:網友
  • 最近由于使用php編寫了一個腳本,模擬實現了一個守護進程,因此需要深入理解php中的垃圾回收機制。本文參考了PHP手冊。

    在理解PHP垃圾回收機制(GC)之前,先了解一下變量的存儲。

    php中變量存在于一個zval的變量容器中。結構如下:

    類型

    is_ref

    refcount

    zval中,除了存儲變量的類型和值之外,還有is_ref字段和refcount字段。

    is_ref:是個bool值,用來區分變量是否屬于引用集合。什么意思呢,你可以這么認為:表示變量是否有一個以上的別名。refcount:計數器,表示指向這個zval變量容器的變量個數。

    兩者之間有這么一個默認關系:當refcount值為1時,is_ref的值為false。因為refcount為1,此變量不可能有多個別名,也就不存在引用了。

    安裝xdebug拓展之后,可以利用xdebug_debug_zval打印出zval容器詳情。

    這里有一點需要注意,將一個變量 = 賦值給另一個變量時,不會立即為新變量分配內存空間,而是在原變量的zval中給refcount加1。 只有當原變量或者發生改變時,才會為新變量分配內存空間,同時原變量的refcount減 1 。當然,如果unset原變量,新變量直接就使用原變量的zval而不是重新分配。

    &引用賦值時,原變量的is_ref 變為1,refcount 加1. 如果給一個變量&賦值,之前 = 賦值的變量會分配空間。

    <?php $a = 1;xdebug_debug_zval('a');echo PHP_EOL;$b = $a;xdebug_debug_zval('a');echo PHP_EOL;$c = &$a;xdebug_debug_zval('a');echo PHP_EOL;xdebug_debug_zval('b');echo PHP_EOL;?>

      運行結果如下:

    a:(refcount=1, is_ref=0),int1

    a:(refcount=2, is_ref=0),int1

    a:(refcount=2, is_ref=1),int1

    b:(refcount=1, is_ref=0),int1

    上面描述的zval存儲的是標量,那復合類型的數組是如何存儲的呢?

    <?php $a = array( 'meaning' => 'life', 'number' => 42 );xdebug_debug_zval( 'a' );echo PHP_EOL;html' target='_blank'>class Test{	public $a = 1;	public $b = 2;		function handle(){		echo 'hehe';	}}$test = new Test();xdebug_debug_zval('test');?>

      運行結果如下:

    a:(refcount=1, is_ref=0),

    array  'meaning' => (refcount=1, is_ref=0),

    string

    'life' (length=4)
      'number' => (refcount=1, is_ref=0),

    int

     42

    test:(refcount=1, is_ref=0),

    object(Test)[1]  public 'a' => (refcount=2, is_ref=0),

    int

     1
      public 'b' => (refcount=2, is_ref=0),

    int

    2

    可以看出,數組用了比數組長度多1個zval存儲。對象類似。下面給出了數組的存儲形象表示

    可以看到:數組分配了三個zval容器:a meaning number

    現在看看所謂的環狀引用是如何生成的

    <?php$a = array( 'one' );$a[] =& $a;xdebug_debug_zval( 'a' );?>

      運行結果:

    a:(refcount=2, is_ref=1),

    array  0 => (refcount=1, is_ref=0),

    string

     'one' (length=3)
      1 => (refcount=2, is_ref=1), &array

    a 和 1 的zval容器 是一樣的。如下:

    這樣就形成了環狀引用。

    在5.2及更早版本的PHP中,沒有專門的垃圾回收器GC(Garbage Collection),引擎在判斷一個變量空間是否能夠被釋放的時候是依據這個變量的zval的refcount的值,如果refcount為0,那么變量的空間可以被釋放,否則就不釋放,這是一種非常簡單的GC實現。

    現在unset ($a),那么array的refcount減1變為1.現在無任何變量指向這個zval,而且這個zval的計數器為1,不會回收。

    盡管不再有某個作用域中的任何符號指向這個結構(就是變量容器),由于數組元素“1”仍然指向數組本身,所以這個容器不能被清除 。因為沒有另外的符號指向它,用戶沒有辦法清除這個結構,結果就會導致內存泄漏。慶幸的是,php將在請求結束時清除這個數據結構,但是在php清除之前,將耗費不少空間的內存。如果你要實現分析算法,或者要做其他像一個子元素指向它的父元素這樣的事情,這種情況就會經常發生。當然,同樣的情況也會發生在對象上,實際上對象更有可能出現這種情況,因為對象總是隱式的被引用。

    如果上面的情況發生僅僅一兩次倒沒什么,但是如果出現幾千次,甚至幾十萬次的內存泄漏,這顯然是個大問題。在長時間運行的腳本,比如請求基本上不會結束的守護進程時,就會出現問題,內存空間會不斷耗費,導致內存不足而崩潰。

    PHP5.3中,采用了專門的算法(比較復雜)。,來處理環狀引用導致內存泄露的問題。

    當一個zval可能為垃圾時,回收算法會把這個zval放入一個內存緩沖區。當緩沖區達到最大臨界值時(最大值可以設置),回收算法會循環遍歷所有緩沖區中的zval,判斷其是否為垃圾,并進行釋放處理?;蛘呶覀冊谀_本中使用gc_collect_cycles,強制回收緩沖區中的垃圾。

    在php5.3的GC中,針對的垃圾做了如下說明:

    1:如果一個zval的refcount增加,那么此zval還在使用,肯定不是垃圾,不會進入緩沖區

    2:如果一個zval的refcount減少到0,那么zval會被立即釋放掉,不屬于GC要處理的垃圾對象,不會進入緩沖區。

    3:如果一個zval的refcount減少之后大于0,那么此zval還不能被釋放,此zval可能成為一個垃圾,將其放入緩沖區。PHP5.3中的GC針對的就是這種zval進行的處理。

    開啟/關閉垃圾回收機制可以通過修改php配置實現,也可以在程序中使用gc_enable()和gc_disable()開啟和關閉。

    開啟垃圾回收機制后,針對內存泄露的情況,可以節省大量的內存空間,但是由于垃圾回收算法運行耗費時間,開啟垃圾回收算法會增加腳本的執行時間。

    下面是php手冊中給的一個腳本

    <?phpclass Foo{    public $var = '3.1415962654';}$baseMemory = memory_get_usage();for ( $i = 0; $i <= 100000; $i++ ){    $a = new Foo;    $a->self = $a;    if ( $i % 500 === 0 )    {        echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "/n";    }}?>

      

    針對這個腳本,給出了其在php5.2和5.3中內存的占用情況,如下圖:

    針對下面這個腳本

    <?phpclass Foo{    public $var = '3.1415962654';}for ( $i = 0; $i <= 1000000; $i++ ){    $a = new Foo;    $a->self = $a;}echo memory_get_peak_usage(), "/n";?>

      

    開啟垃圾回收機制,相對于不開啟的時候,腳本執行時間增加了7%

    通常,PHP中的垃圾回收機制,僅僅在循環回收算法確實運行時會有時間消耗上的增加。但是在平常的(更小的)腳本中應根本就沒有性能影響。


    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    国产精品爽爽ⅴa在线观看| 亚洲精品久久久久久久久久久| 国产欧美久久一区二区| 日韩av电影手机在线观看| 亚洲成avwww人| 国产成人aa精品一区在线播放| 91欧美日韩一区| 欧美激情在线观看| 日韩国产高清视频在线| 色伦专区97中文字幕| 国产在线拍偷自揄拍精品| 欧美日韩免费区域视频在线观看| 亚洲成年人在线| 亚洲国产黄色片| 在线观看欧美日韩国产| 亚洲综合在线播放| 欧美日韩亚洲成人| 欧美韩国理论所午夜片917电影| 永久免费毛片在线播放不卡| 2020欧美日韩在线视频| 国产精品高潮在线| 97免费在线视频| 2021久久精品国产99国产精品| 91精品一区二区| 色综合五月天导航| 日韩精品小视频| 92福利视频午夜1000合集在线观看| 日韩视频免费在线观看| 55夜色66夜色国产精品视频| 久久伊人色综合| 亚洲偷熟乱区亚洲香蕉av| 欧美片一区二区三区| 91chinesevideo永久地址| 色综合色综合网色综合| 97超碰蝌蚪网人人做人人爽| 欧美激情视频网站| 亚洲欧美国产精品久久久久久久| 亚洲欧美日韩在线一区| 国产999在线观看| 亚洲网站在线看| 成人a级免费视频| 亚洲精品乱码久久久久久金桔影视| 日韩精品视频在线| 欧美成人合集magnet| 亚洲毛茸茸少妇高潮呻吟| 九九热视频这里只有精品| 欧美亚洲伦理www| 亚洲欧美综合精品久久成人| 国产精品亚洲精品| 日本伊人精品一区二区三区介绍| 精品毛片三在线观看| 国产精品偷伦一区二区| 欧美亚洲在线播放| 亚洲理论片在线观看| 日韩性xxxx爱| 欧美日韩亚洲一区二| 日韩电影在线观看免费| 国产有码在线一区二区视频| 国产欧美精品一区二区三区介绍| 啊v视频在线一区二区三区| 日韩小视频在线观看| 一区二区三区天堂av| 国产精品久久久久久网站| 2020久久国产精品| 久久天堂av综合合色| 精品亚洲精品福利线在观看| 久久久精品免费视频| 欧美乱妇高清无乱码| 国产综合视频在线观看| 国产精品久久久久久搜索| 不卡中文字幕av| 91成人精品网站| 亚洲福利在线播放| 伊人成人开心激情综合网| 国产极品jizzhd欧美| 欧美日韩亚洲一区二区三区| 中文字幕日本欧美| 97色在线观看免费视频| 最近2019中文免费高清视频观看www99| 久久精品国产亚洲一区二区| 深夜精品寂寞黄网站在线观看| 国产亚洲精品一区二区| 日韩免费在线电影| 国产亚洲视频在线| 久久久国产精彩视频美女艺术照福利| 一区二区成人av| 亚洲成人1234| 午夜精品一区二区三区在线播放| 国产成人精品a视频一区www| 亚洲国产成人爱av在线播放| 亚洲3p在线观看| 国产精品免费看久久久香蕉| 91久久中文字幕| 欧美亚洲在线视频| 国内伊人久久久久久网站视频| 亚洲精品美女视频| 在线观看日韩av| 亚洲人成在线观看| 少妇av一区二区三区| 91精品国产综合久久男男| 91欧美日韩一区| 欧美亚洲午夜视频在线观看| 日韩中文字幕精品视频| 久久免费视频网| 亚洲色图25p| 久久免费少妇高潮久久精品99| 日本高清视频精品| 性日韩欧美在线视频| 亚洲热线99精品视频| 中文字幕亚洲欧美日韩高清| 国产精品美女久久久免费| 亚洲欧美日韩网| 中文字幕亚洲色图| 欧美激情小视频| 九九九热精品免费视频观看网站| 久久精品国产欧美亚洲人人爽| 欧美日韩在线观看视频小说| 欧美在线一级va免费观看| 日韩av一区二区在线| 亚洲国产精品专区久久| 日韩中文视频免费在线观看| 国产精品一区二区三区免费视频| 夜夜嗨av一区二区三区四区| 国产精品成av人在线视午夜片| 亚洲女人天堂视频| 日韩在线免费观看视频| 亚洲第一男人av| 成人午夜在线视频一区| 国产91精品高潮白浆喷水| 欧洲精品久久久| 久久久999国产精品| 成人性生交大片免费看视频直播| 最近2019中文免费高清视频观看www99| 亚洲美女中文字幕| 欧美情侣性视频| 国产精品视频最多的网站| 久久色在线播放| 国产91九色视频| 国产91色在线|| 在线观看国产精品91| 欧美日韩午夜视频在线观看| 人妖精品videosex性欧美| 91精品中文在线| 97精品欧美一区二区三区| 成人av.网址在线网站| 岛国av一区二区三区| 久久久之久亚州精品露出| 国产精品免费福利| 国产精品v日韩精品| 最新的欧美黄色| 在线视频免费一区二区| 精品自拍视频在线观看| 日韩国产精品亚洲а∨天堂免| 欧美午夜女人视频在线| 中文日韩电影网站| 不用播放器成人网| 亚洲欧美另类自拍| 日韩成人黄色av| 91国在线精品国内播放| 亚洲91精品在线观看| 北条麻妃一区二区三区中文字幕| 97在线观看免费| 欧美性感美女h网站在线观看免费| 亚洲美女在线视频|