亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

PHP特點(diǎn)之垃圾回收機(jī)制2——回收周期

瀏覽:7日期:2022-09-15 14:44:28

傳統(tǒng)上,像以前的 php 用到的引用計(jì)數(shù)內(nèi)存機(jī)制,無法處理循環(huán)的引用內(nèi)存泄漏。然而 5.3.0 PHP 使用文章? 引用計(jì)數(shù)系統(tǒng)中的同步周期回收(Concurrent Cycle Collection in Reference Counted Systems)中的同步算法,來處理這個(gè)內(nèi)存泄漏問題。

對(duì)算法的完全說明有點(diǎn)超出這部分內(nèi)容的范圍,將只介紹其中基礎(chǔ)部分。首先,我們先要建立一些基本規(guī)則,如果一個(gè)引用計(jì)數(shù)增加,它將繼續(xù)被使用,當(dāng)然就不再在垃圾中。如果引用計(jì)數(shù)減少到零,所在變量容器將被清除(free)。就是說,僅僅在引用計(jì)數(shù)減少到非零值時(shí),才會(huì)產(chǎn)生垃圾周期(garbage cycle)。其次,在一個(gè)垃圾周期中,通過檢查引用計(jì)數(shù)是否減1,并且檢查哪些變量容器的引用次數(shù)是零,來發(fā)現(xiàn)哪部分是垃圾。

PHP特點(diǎn)之垃圾回收機(jī)制2——回收周期

為避免不得不檢查所有引用計(jì)數(shù)可能減少的垃圾周期,這個(gè)算法把所有可能根(possible roots 都是zval變量容器),放在根緩沖區(qū)(root buffer)中(用紫色來標(biāo)記),這樣可以同時(shí)確保每個(gè)可能的垃圾根(possible garbage root)在緩沖區(qū)中只出現(xiàn)一次。僅僅在根緩沖區(qū)滿了時(shí),才對(duì)緩沖區(qū)內(nèi)部所有不同的變量容器執(zhí)行垃圾回收操作。看上圖的步驟 A。

在步驟 B 中,算法使用深度優(yōu)先搜索查找所有可能的根,找到后將每個(gè)變量容器中的引用計(jì)數(shù)減“1',為確保不會(huì)對(duì)同一個(gè)變量容器減兩次'1',用灰色標(biāo)記已減過“1”的。在步驟 C 中,算法再一次對(duì)每個(gè)根節(jié)點(diǎn)使用深度優(yōu)先搜索,檢查每個(gè)變量容器的引用計(jì)數(shù)。如果引用計(jì)數(shù)是 0 ,變量容器用白色來標(biāo)記(圖中的藍(lán)色)。如果引用次數(shù)大于0,則恢復(fù)在這個(gè)點(diǎn)上使用深度優(yōu)先搜索而將引用計(jì)數(shù)減”1“的操作(即引用計(jì)數(shù)加“1”),然后將它們重新用黑色標(biāo)記。在最后一步 D 中,算法遍歷根緩沖區(qū)以從那里刪除變量容器根(zval roots),同時(shí),檢查是否有在上一步中被白色標(biāo)記的變量容器。每個(gè)被白色標(biāo)記的變量容器都被清除。

現(xiàn)在,你已經(jīng)對(duì)這個(gè)算法有了基本了解,我們回頭來看這個(gè)如何與PHP集成。默認(rèn)的,PHP的垃圾回收機(jī)制是打開的,然后有個(gè) php.ini 設(shè)置允許你修改它:zend.enable_gc

當(dāng)垃圾回收機(jī)制打開時(shí),每當(dāng)根緩存區(qū)存滿時(shí),就會(huì)執(zhí)行上面描述的循環(huán)查找算法。根緩存區(qū)有固定的大小,可存10,000個(gè)可能根,當(dāng)然你可以通過修改PHP源碼文件Zend/zend_gc.c中的常量GC_ROOT_BUFFER_MAX_ENTRIES,然后重新編譯PHP,來修改這個(gè)10,000值。當(dāng)垃圾回收機(jī)制關(guān)閉時(shí),循環(huán)查找算法永不執(zhí)行,然而,可能根將一直存在根緩沖區(qū)中,不管在配置中垃圾回收機(jī)制是否激活。

當(dāng)垃圾回收機(jī)制關(guān)閉時(shí),如果根緩沖區(qū)存滿了可能根,更多的可能根顯然不會(huì)被記錄。那些沒被記錄的可能根,將不會(huì)被這個(gè)算法來分析處理。如果他們是循環(huán)引用周期的一部分,將永不能被清除進(jìn)而導(dǎo)致內(nèi)存泄漏。

即使在垃圾回收機(jī)制不可用時(shí),可能根也被記錄的原因是,相對(duì)于每次找到可能根后檢查垃圾回收機(jī)制是否打開而言,記錄可能根的操作更快。不過垃圾回收和分析機(jī)制本身要耗不少時(shí)間。

除了修改配置zend.enable_gc ,也能通過分別調(diào)用 gc_enable() 和 gc_disable()函數(shù)來打開和關(guān)閉垃圾回收機(jī)制。調(diào)用這些函數(shù),與修改配置項(xiàng)來打開或關(guān)閉垃圾回收機(jī)制的效果是一樣的。即使在可能根緩沖區(qū)還沒滿時(shí),也能強(qiáng)制執(zhí)行周期回收。你能調(diào)用 gc_collect_cycles()函數(shù)達(dá)到這個(gè)目的。這個(gè)函數(shù)將返回使用這個(gè)算法回收的周期數(shù)。

允許打開和關(guān)閉垃圾回收機(jī)制并且允許自主的初始化的原因,是由于你的應(yīng)用程序的某部分可能是高時(shí)效性的。在這種情況下,你可能不想使用垃圾回收機(jī)制。當(dāng)然,對(duì)你的應(yīng)用程序的某部分關(guān)閉垃圾回收機(jī)制,是在冒著可能內(nèi)存泄漏的風(fēng)險(xiǎn),因?yàn)橐恍┛赡芨苍S存不進(jìn)有限的根緩沖區(qū)。因此,就在你調(diào)用 gc_disable()函數(shù)釋放內(nèi)存之前,先調(diào)用 gc_collect_cycles()函數(shù)可能比較明智。因?yàn)檫@將清除已存放在根緩沖區(qū)中的所有可能根,然后在垃圾回收機(jī)制被關(guān)閉時(shí),可留下空緩沖區(qū)以有更多空間存儲(chǔ)可能根。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 精品久久久久久久久久久 | 国产欧美日本在线 | 真人一级一级特黄高清毛片 | 日本道综合一本久久久88 | 欧美日韩一区二区三区四区在线观看 | 久久精品一区 | 精品国产美女福利到在线不卡 | 国产成人精品视频免费大全 | 亚洲一区二区三区不卡在线播放 | 久久久久综合给合狠狠狠 | 成人看片黄a在线观看 | 国产欧美日韩精品第三区 | 成人18免费网站在线观看 | 国产一级毛片国语版 | 手机看片成人 | 国产欧美日韩另类 | 午夜欧美在线 | 综合 欧美 亚洲日本 | 欧美另类视频在线观看 | 天堂在线www网亚洲 天堂在线视频网站 | 老司机亚洲精品影院 | 天天看有黄有色大片 | 国产精品久久久久久久久久直 | 久久精品国产免费中文 | 免费看欧美xxx片 | 波多野结衣在线播放 | 国产免费久久精品久久久 | 九九视频在线看精品 | 特黄大片aaaaa毛片 | 台湾精品视频在线观看 | 日韩欧美视频在线播放 | 亚洲精品一区二区三区四区 | 久久免费精品 | 2022久久免费精品国产72精品 | 免费人成年短视频在线观看网站 | 白白在线观看永久免费视频 | 青青草国产免费久久久91 | 国产精亚洲视频 | 国产精品久久久久影院色老大 | 国产精品拍自在线观看 | 亚洲免费成人 |