校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 淺析PHP7 的垃圾回收機制

淺析PHP7 的垃圾回收機制

熱門標簽:江西手機自動外呼防封系統是什么 廣州防封卡外呼系統多少錢一個月 廣東地市地圖標注 怎么向銷售公司推銷外呼系統 仁和怎么申請400開頭的電話 哪里辦理400電話 高德地圖標注家 外呼系統撥打暫時無法接通 長春人工外呼系統服務商

垃圾回收機制

垃圾回收機制是一種動態存儲分配方案。它會自動釋放程序不再需要的已分配的內存塊。 自動回收內存的過程叫垃圾收集。垃圾回收機制可以讓程序員不必過分關心程序內存分配,從而將更多的精力投入到業務邏輯。 在現在的流行各種語言當中,垃圾回收機制是新一代語言所共有的特征。

垃圾的產生

PHP7 中復雜類型,像字符串、數組、對象等的數據結構中,頭部都有一個 gc, 這個 gc 的作用就是用來對垃圾回收的支持。當變量賦值、傳遞時,會增加 value 的引用數, unset、return 等釋放變量時再減掉引用數,減掉后如果發現 refcount 變為 0 則直接釋放 value,這是變量的基本回收過程。

不過有一種問題是這個機制無法解決的,就是循環引用的問題。

什么是循環引用呢? 簡單說就是變量的內部里存的 value 又引用了變量自身。 這種比較經常發生在數組和對象類型的變量上。

這里先講一下引用,即 zend_reference 這個類型,這個是 PHP7 新增的變量類型,當對變量使用 “” 操作時,會創建新的中間結構體 zend_reference,這個結構體會真正的指向對應的 value 結構。

舉個例子:

// 當進行如下賦值操作時
$a = 'hello'; // $a -> zend_string
$b = $a; // $b,$a -> zend_string
$c = $b; // $c,$b -> zval(type = IS_REFERENCE, refcount = 2) -> zend_string


最終會變成如下這樣:

 

即 $b 和 $c 的 zval 是通過中間結構體 zend_reference 再指向最終的 zend_string

回到循環引用的問題,舉個數組循環引用例子:

$arr = [1];
$a[] = $a;
unset($a);

使用 操作之后,變量 a 就變成了引用類型且引用計數 refcount 為 2,而又賦值給自己里面的元素,即變量 a 變成了自己引用自己。

具體如下如所示:

 

當 unset 之后就變成下圖這樣:

 

即 $a 所在的 zval 類型已經變成了 IS_UNDEF 了,zend_reference 結構體的引用計數減 1,但是仍然大于 0,這時候,這部分結構體就變成了垃圾,對此不處理的話,就可能會造成內存泄露。這里就需要垃圾收集器將這部分收集到緩沖區,之后進行回收處理。

回收過程

如果當變量的 refcount 減小后大于 0,PHP 并不會立即對這個變量進行垃圾鑒定和回收,而是放入一個緩沖區中,等這個緩沖區滿了以后(10000 個值)再統一進行處理,加入緩沖區的是變量 zend_value 里的 gc,目前垃圾只會出現在數組和對象兩種類型中,數組的情況上面已經介紹了,對象的情況則是成員屬性引用對象本身導致的,其它類型不會出現這種變量中的成員引用變量自身的情況,所以垃圾回收只會處理這兩種類型的變量。

gc 的結構 zend_refcounted_h 具體如下:

typedef struct _zend_refcounted_h {
  uint32_t     refcount; // 記錄 zend_value 的引用數
  union {
    struct {
      zend_uchar  type, // zend_value的類型, 與zval.u1.type一致
      zend_uchar  flags, 
      uint16_t   gc_info // GC信息,記錄在 gc 池中的位置和顏色,垃圾回收的過程會用到
    } v;
    uint32_t type_info;
  } u;
} zend_refcounted_h;

一個變量只能加入一次緩沖區,為了防止重復加入,變量加入后會把 zend_refcounted_h.gc_info 置為 GC_PURPLE,即標為紫色,后續不會重復插入。

垃圾緩沖區是一個雙向鏈表,等到緩存區滿了以后則啟動垃圾檢查過程:遍歷緩沖區,對當前變量的所有成員進行遍歷,然后把成員的 refcount 減 1 (如果成員還包含子成員則也進行遞歸遍歷,即深度優先遍歷),最后再檢查當前變量的引用,如果減為了 0 則為垃圾。這個算法的原理核心是:垃圾是由于成員引用自身導致的,那么就對所有的成員減一遍引用,如果發現最后變量本身的 refcount 變為了 0 則就表明其引用全部來自自身成員,即其他任何地方都不再使用它,那么它就是垃圾,需要被回收掉。反之說明不是垃圾,需要將其從緩沖區移出去。具體的過程如下:

(1) 從緩沖區鏈表的 roots 開始遍歷,把當前 value 標為灰色 (zend_refcounted_h.gc_info 置為 GC_GREY),然后對當前 value 的成員進行深度優先遍歷,把成員 value 的 refcount 減 1,并且也標為灰色;

(2) 重復遍歷緩沖區鏈表,檢查當前 value 引用是否為 0,為 0 則表示確實是垃圾,把它標為白色(GC_WHITE),如果不為 0 則排除了引用全部來自自身成員的可能,表示還有外部的引用,并不是垃圾,這時候因為步驟(1)對成員進行了 refcount 減 1 操作,需要再還原回去,對所有成員進行深度遍歷,把成員 refcount 加 1,同時標為黑色;

(3) 再次遍歷緩沖區鏈表,將非 GC_WHITE 的節點從 roots 鏈表中移出(移到待釋放的列表),最終 roots 鏈表中全部為真正的垃圾,最后將這些垃圾清除。

總結

以上所述是小編給大家介紹的PHP7 的垃圾回收機制,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • PHP垃圾回收機制的一些理解
  • PHP的垃圾回收機制代碼實例講解
  • PHP session垃圾回收機制實例分析
  • PHP進階學習之垃圾回收機制詳解
  • PHP析構函數destruct與垃圾回收機制的講解
  • 掌握PHP垃圾回收機制詳解
  • php中session垃圾回收機制
  • 總結PHP內存釋放以及垃圾回收
  • 解讀PHP中的垃圾回收機制
  • 析構函數與php的垃圾回收機制詳解
  • PHP中垃圾回收相關函數的使用

標簽:湘西 黔東 廈門 惠州 海北 梅河口 文山 濮陽

巨人網絡通訊聲明:本文標題《淺析PHP7 的垃圾回收機制》,本文關鍵詞  淺析,PHP7,的,垃圾,回收,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析PHP7 的垃圾回收機制》相關的同類信息!
  • 本頁收集關于淺析PHP7 的垃圾回收機制的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产一区二区三区香蕉| 中文字幕视频一区| 久久国产精品免费| 欧美mv日韩mv| 成人精品免费视频| 悠悠色在线精品| 欧美精品丝袜久久久中文字幕| 日本午夜一区二区| 国产欧美精品一区二区色综合| gogogo免费视频观看亚洲一| 一个色妞综合视频在线观看| 91精品国产91综合久久蜜臀| 国产一区二区三区综合| 亚洲欧美综合另类在线卡通| 欧美日韩黄色影视| 国产久卡久卡久卡久卡视频精品| 国产精品久99| 日韩一区二区中文字幕| 成人国产精品免费网站| 亚洲综合色网站| 日韩精品一区二区三区四区视频| 国产精品99久久久久久有的能看| 国产精品三级久久久久三级| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲免费在线看| 91精品国产综合久久精品| 国产福利一区在线| 亚洲妇熟xx妇色黄| 欧美国产一区二区在线观看| 欧美日本一区二区三区| 国产69精品久久777的优势| 亚洲超丰满肉感bbw| 国产女人aaa级久久久级| 欧美性大战久久久久久久 | 成人一级片网址| 亚洲品质自拍视频网站| 制服丝袜亚洲网站| 国v精品久久久网| 亚洲图片欧美一区| 欧美精品一区二区三区蜜桃| 99视频精品全部免费在线| 午夜日韩在线观看| 久久亚洲综合色| 91蝌蚪porny成人天涯| 蜜桃久久久久久| 亚洲图片你懂的| 日韩女优av电影在线观看| 99精品国产91久久久久久| 日本强好片久久久久久aaa| 亚洲国产成人在线| 欧美一区二区三区视频在线| 成人精品鲁一区一区二区| 午夜精品一区二区三区电影天堂 | 久久久久久9999| 欧美一区二区视频在线观看2020| 色吊一区二区三区| 99这里都是精品| 国产河南妇女毛片精品久久久| 蜜臀va亚洲va欧美va天堂| 亚洲永久免费视频| 亚洲欧美日韩成人高清在线一区| 国产欧美一区二区三区鸳鸯浴| 亚洲高清免费视频| zzijzzij亚洲日本少妇熟睡| 丝袜美腿一区二区三区| 亚洲国产一二三| 一区二区理论电影在线观看| 日韩一区日韩二区| 国产精品国产三级国产普通话蜜臀| 国产亚洲福利社区一区| 国产亚洲视频系列| 久久久夜色精品亚洲| 久久色在线观看| 久久久久97国产精华液好用吗| 日韩欧美激情在线| xfplay精品久久| 久久精品日韩一区二区三区| 国产欧美一区二区三区在线老狼| 久久九九久精品国产免费直播| 久久久久久久久97黄色工厂| 日本一区免费视频| 日韩毛片视频在线看| 亚洲免费大片在线观看| 亚洲福利视频一区| 五月激情综合色| 日韩精品福利网| 久久aⅴ国产欧美74aaa| 国产成人av网站| 99精品欧美一区二区三区小说| 91一区一区三区| av一本久道久久综合久久鬼色| 精品一区二区三区欧美| 成人一区二区三区在线观看| 91在线porny国产在线看| 欧美中文字幕一二三区视频| 91精品国产手机| 国产亚洲va综合人人澡精品| 国产日韩成人精品| 国产精品美女久久久久久| 国产精品久久久一本精品| 欧美久久久久久久久| 91精品啪在线观看国产60岁| 日韩欧美一二三区| 久久人人爽爽爽人久久久| 久久亚洲欧美国产精品乐播| 久久美女艺术照精彩视频福利播放| 久久综合狠狠综合久久综合88| 久久久不卡影院| 中文字幕亚洲在| 亚洲一区二区视频| 青青草国产成人av片免费| 国产精品系列在线观看| 欧美性一区二区| 久久久久久久久久久久久久久99| 亚洲图片欧美激情| 精品无人码麻豆乱码1区2区| 99re8在线精品视频免费播放| 7777精品伊人久久久大香线蕉| 国产精品污网站| 日韩 欧美一区二区三区| 99精品黄色片免费大全| 欧美岛国在线观看| 一区二区成人在线视频| 国产裸体歌舞团一区二区| 在线免费视频一区二区| 精品国产99国产精品| 亚洲一区二区欧美| 懂色av中文一区二区三区| 欧美一区二区免费| 亚洲激情图片小说视频| 国产不卡免费视频| 欧美大片日本大片免费观看| 亚洲综合激情小说| 成人午夜av在线| 久久亚洲免费视频| 日本午夜精品一区二区三区电影| 91麻豆国产在线观看| 久久亚区不卡日本| 人人狠狠综合久久亚洲| 91网站黄www| 国产精品久久久久久久久快鸭 | 日韩一区二区在线免费观看| 成人免费在线播放视频| 国产在线精品免费| 91精品国产综合久久精品麻豆| 一区二区三区 在线观看视频| 国产成人亚洲精品青草天美| 91麻豆精品国产91久久久久久| 亚洲精品国产精品乱码不99| av综合在线播放| 国产精品无圣光一区二区| 国产一区中文字幕| 久久你懂得1024| 国产一区二区在线观看免费| 日韩视频一区二区三区| 日韩精品欧美精品| 91精品国产欧美一区二区18 | 精品一区二区三区视频在线观看| 欧美午夜在线观看| 亚洲综合在线免费观看| 日本高清不卡视频| 亚洲人被黑人高潮完整版| 99国产精品国产精品毛片| 亚洲视频狠狠干| 91国偷自产一区二区开放时间| 一区二区三区产品免费精品久久75| 91视频在线观看免费| 一区二区高清免费观看影视大全 | 亚洲天堂久久久久久久| 91在线观看地址| 亚洲综合在线电影| 欧美人xxxx| 日本va欧美va瓶| 精品久久久久久久久久久久久久久久久 | 3atv一区二区三区| 久久国产免费看| 国产亚洲一区二区三区在线观看| 久久国产精品99精品国产| 久久久久久久久久久久久夜| 成人一级片网址| 一区二区三区在线免费播放| 欧美三电影在线| 老鸭窝一区二区久久精品| 久久久蜜臀国产一区二区| 成人动漫在线一区| 一区二区三区视频在线看| 欧美网站一区二区| 久久69国产一区二区蜜臀| 日本一区二区视频在线观看| 色av一区二区| 免费成人在线影院| 国产精品美女一区二区在线观看| 色综合中文字幕国产 | 亚洲一区二区三区四区五区黄| 欧美精品在线视频| 国产做a爰片久久毛片| 中文字幕一区在线观看| 7777精品伊人久久久大香线蕉完整版| 久久国产精品99精品国产 | www.亚洲国产|