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

首頁 > 編程 > PHP > 正文

php底層原理的垃圾回收機制的介紹(代碼示例)

2020-03-22 19:31:25
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于php底層原理的垃圾回收機制的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

 

php垃圾回收機制,對于PHPer來說是一個不陌生但是又不是很熟悉的內容。那么php是怎么實現對不需要的內存進行回收的呢?

html' target='_blank'>php變量的內部存儲結構

首先還是需要了解下基礎知識,便于垃圾回收原理內容的理解。大家都知道php是由C編寫而成的,所以php變量的內部存儲結構也會和C語言相關,即zval的結構體:

struct _zval_struct { union { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; zend_ast *ast; } value; //變量value值 zend_uint refcount__gc; //引用計數內存中使用次數,為0刪除該變量 zend_uchar type; //變量類型 zend_uchar is_ref__gc; //區分是否是引用變量};

從上面結構體內容可以看出每一個php變量都會由變量類型、value值、引用計數次數和是否是引用變量四部分組成

注:上面zval結構體是php5.3版本之后的結構,php5.3之前因為沒有引入新的垃圾回收機制,即GC,所以命名也沒有_gc;而php7版本之后由于性能問題所以改寫了zval結構,這里不再表述

引用計數原理

了解了php變量的內部存儲結構之后,我們再了解下php變量賦值相關的原理和早期垃圾回收機制

變量容器

非array和object變量

每次將常量賦值給一個變量時,都會產生一個變量容器

舉例:

$a = 許錚的技術成長之路 xdebug_debug_zval( a )

結果:

a: (refcount=1, is_ref=0)= 許錚的技術成長之路 
array和object變量

會產生元素個數+1的變量容器

舉例:

$b = [ name = 許錚的技術成長之路 , number = 3xdebug_debug_zval( b )

結果:

b: (refcount=1, is_ref=0)=array ( name = (refcount=1, is_ref=0)= 許錚的技術成長之路 , number = (refcount=1, is_ref=0)=3)
賦值原理(寫時復制技術)

了解了常量賦值之后,接下來我們從內存角度思考變量之間的賦值

舉例:

$a = [ name = 許錚的技術成長之路 , number = 3]; //創建一個變量容器,變量a指向給變量容器,a的ref_count為1$b = $a; //變量b也指向變量a指向的變量容器,a和b的ref_count為2xdebug_debug_zval( a , b $b[ name ] = 許錚的技術成長之路1 //變量b的其中一個元素發生改變,此時會復制出一個新的變量容器,變量b重新指向新的變量容器,a和b的ref_count變成1xdebug_debug_zval( a , b 

結果:

a: (refcount=2, is_ref=0)=array ( name = (refcount=1, is_ref=0)= 許錚的技術成長之路 , number = (refcount=1, is_ref=0)=3)b: (refcount=2, is_ref=0)=array ( name = (refcount=1, is_ref=0)= 許錚的技術成長之路 , number = (refcount=1, is_ref=0)=3)a: (refcount=1, is_ref=0)=array ( name = (refcount=1, is_ref=0)= 許錚的技術成長之路 , number = (refcount=1, is_ref=0)=3)b: (refcount=1, is_ref=0)=array ( name = (refcount=1, is_ref=0)= 許錚的技術成長之路1 , number = (refcount=1, is_ref=0)=3)

所以,當變量a賦值給變量b的時候,并沒有立刻生成一個新的變量容器,而是將變量b指向了變量a指向的變量容器,即內存 共享 ;而當變量b其中一個元素發生改變時,才會真正發生變量容器復制,這就是寫時復制技術

引用計數清0

當變量容器的ref_count計數清0時,表示該變量容器就會被銷毀,實現了內存回收,這也是php5.3版本之前的垃圾回收機制

舉例:

$a = 許錚的技術成長之路 $b = $a;xdebug_debug_zval( a unset($b);xdebug_debug_zval( a 

結果:

a: (refcount=2, is_ref=0)= 許錚的技術成長之路 a: (refcount=1, is_ref=0)= 許錚的技術成長之路 
循環引用引發的內存泄露問題

但是php5.3版本之前的垃圾回收機制存在一個漏洞,即當數組或對象內部子元素引用其父元素,而此時如果發生了刪除其父元素的情況,此變量容器并不會被刪除,因為其子元素還在指向該變量容器,但是由于所有作用域內都沒有指向該變量容器的符號,所以無法被清除,因此會發生內存泄漏,直到該腳本執行結束

舉例:

$a = array( one $a[] = xdebug_debug_zval( a 

由于該示例不好輸出結果,用圖表示,如圖:

2831025070-5c7b63311e835_articlex.png

舉例:

unset($a);xdebug_debug_zval( a 

如圖:

2974313796-5c7b63311fd7a_articlex.png

新的垃圾回收機制

php5.3版本之后引入根緩沖機制,即php啟動時默認設置指定zval數量的根緩沖區(默認是10000),當php發現有存在循環引用的zval時,就會把其投入到根緩沖區,當根緩沖區達到配置文件中的指定數量(默認是10000)后,就會進行垃圾回收,以此解決循環引用導致的內存泄漏問題

確認為垃圾的準則

1、如果引用計數減少到零,所在變量容器將被清除(free),不屬于垃圾
2、如果一個zval 的引用計數減少后還大于0,那么它會進入垃圾周期。其次,在一個垃圾周期中,通過檢查引用計數是否減1,并且檢查哪些變量容器的引用次數是零,來發現哪部分是垃圾。

總結

垃圾回收機制:
1、以php的引用計數機制為基礎(php5.3以前只有該機制)
2、同時使用根緩沖區機制,當php發現有存在循環引用的zval時,就會把其投入到根緩沖區,當根緩沖區達到配置文件中的指定數量后,就會進行垃圾回收,以此解決循環引用導致的內存泄漏問題(php5.3開始引入該機制)

以上就是php底層原理的垃圾回收機制的介紹(代碼示例)的詳細內容,PHP教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲影影院av| 亚洲人av在线影院| 另类色图亚洲色图| 日韩黄色高清视频| 亚洲乱亚洲乱妇无码| 亚洲精品二三区| 国产欧美日韩91| 亚洲精品99久久久久中文字幕| 国产精品视频午夜| 国产精品揄拍500视频| 日韩大片免费观看视频播放| 最新69国产成人精品视频免费| 欧美精品videofree1080p| 国产成人在线一区二区| 在线播放精品一区二区三区| 色噜噜久久综合伊人一本| 在线国产精品视频| 亚洲色图综合久久| 欧美精品18videos性欧| 亚洲欧美制服另类日韩| 81精品国产乱码久久久久久| 最近2019年中文视频免费在线观看| 日韩av在线播放资源| 日本亚洲欧洲色| 欧美亚洲另类视频| 中文在线资源观看视频网站免费不卡| 日本高清不卡的在线| 日韩av在线免费播放| 日韩精品视频免费专区在线播放| 日产精品久久久一区二区福利| 欧美性猛交xxxx乱大交蜜桃| 久热国产精品视频| 国产日本欧美一区二区三区| 久久天天躁狠狠躁老女人| 97在线免费观看视频| 国产亚洲视频在线| 欧美人与性动交a欧美精品| 精品视频一区在线视频| 成人高清视频观看www| 久久在线免费观看视频| 亚洲综合视频1区| 日韩小视频网址| 欧美性资源免费| 亚洲深夜福利网站| 国产成人97精品免费看片| 欧美电影免费观看大全| 欧美日韩高清区| 亚洲视频电影图片偷拍一区| 性色av一区二区三区在线观看| 亚洲综合色av| 成人疯狂猛交xxx| 欧美日韩一区二区免费视频| 日韩在线观看免费高清| 中文欧美在线视频| 亚洲精品日韩激情在线电影| 成年无码av片在线| 另类专区欧美制服同性| 九九久久久久久久久激情| 欧美视频在线观看 亚洲欧| 97碰碰碰免费色视频| 亚洲一区久久久| 欧美成人中文字幕| 亚洲a级在线播放观看| 综合国产在线视频| 亚洲国产高清福利视频| 日韩经典中文字幕在线观看| 久久久亚洲国产天美传媒修理工| 精品国产网站地址| 自拍偷拍亚洲一区| 日韩一区二区福利| 日韩精品在线免费观看视频| 国产精品美女av| 在线播放国产一区中文字幕剧情欧美| 欧洲永久精品大片ww免费漫画| 日韩中文字幕精品视频| 97在线视频免费看| 精品国产欧美一区二区三区成人| 日韩视频中文字幕| 一个人看的www久久| 成人免费高清完整版在线观看| 国产精品福利小视频| 国产在线精品一区免费香蕉| 精品亚洲一区二区三区| 欧美老女人在线视频| 色播久久人人爽人人爽人人片视av| 亚洲精品美女视频| 97在线免费观看| 精品久久久一区| 5566日本婷婷色中文字幕97| 国产亚洲人成网站在线观看| 中文字幕v亚洲ⅴv天堂| 亚洲欧洲激情在线| 欧美日韩xxx| 欧美性色19p| 成人免费淫片视频软件| 欧美日韩国产二区| 国产成人精品亚洲精品| 久久久亚洲网站| 欧美极品少妇全裸体| 亚洲黄色有码视频| 久久男人av资源网站| 国产精品久久久久av免费| 国产精品igao视频| 成人淫片在线看| 九九热这里只有精品6| 国产一区二区三区四区福利| 国产精品精品久久久久久| 欧美色另类天堂2015| 4444欧美成人kkkk| 久久久久久久亚洲精品| 亚洲人成网站999久久久综合| 91在线网站视频| 精品国内亚洲在观看18黄| 国产亚洲美女精品久久久| 97超级碰碰碰| 亚洲激情免费观看| 青草青草久热精品视频在线观看| 精品久久久一区| 精品日本美女福利在线观看| 国产精品成人va在线观看| 一级做a爰片久久毛片美女图片| 色综合天天狠天天透天天伊人| 国产91免费看片| 国产免费成人av| 2025国产精品视频| 中文字幕久热精品在线视频| 97国产在线视频| 九九九热精品免费视频观看网站| 欧美夫妻性生活视频| 亚洲网站在线观看| 亚洲激情在线观看| 亚洲图中文字幕| 欧美一区二区三区免费视| 日韩乱码在线视频| 97在线看福利| 亚洲精品国产精品国自产在线| 成人www视频在线观看| 国产日韩av在线| 欧美精品久久一区二区| 国产精品一区二区三区久久久| 亚洲国产日韩一区| 日韩欧美一区二区三区久久| 91网站在线免费观看| 亚洲自拍在线观看| 羞羞色国产精品| 亚洲一区二区福利| 久久久久久国产精品美女| 欧美最猛性xxxxx(亚洲精品)| 久久91精品国产91久久久| 欧美在线视频一二三| 日韩女优人人人人射在线视频| 欧美一区二粉嫩精品国产一线天| 久久亚洲精品成人| 日韩久久午夜影院| 中文字幕亚洲综合| 久久久久国产精品免费| 欧美自拍视频在线观看| 亚洲日本成人女熟在线观看| 欧美高清视频在线观看| 成人国产精品一区| 亚洲精品免费网站| 国产欧美在线播放| 欧美日韩免费观看中文| 亚洲资源在线看|