成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PHP回收周期

Astrian / 1080人閱讀

摘要:原文回收周期,增加一篇論文在底部。就是說,僅僅在引用計數(shù)減少到非零值時,才會產(chǎn)生垃圾周期。如果他們是循環(huán)引用周期的一部分,將永不能被清除進而導(dǎo)致內(nèi)存泄漏。這個函數(shù)將返回使用這個算法回收的周期數(shù)。引用計數(shù)系統(tǒng)中的同步周期回收

原文:回收周期(Collecting Cycles) ,增加一篇論文在底部。

以下過程僅對數(shù)組和對象類型起作用。

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

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

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

在步驟 B 中,模擬刪除每個紫色變量。模擬刪除時可能將不是紫色的普通變量引用數(shù)減”1″,如果某個普通變量引用計數(shù)變成0了,就對這個普通變量再做一次模擬刪除。每個變量只能被模擬刪除一次,模擬刪除后標記為灰(原文說確保不會對同一個變量容器減兩次”1″,不對的吧)。

在步驟 C 中,模擬恢復(fù)每個紫色變量?;謴?fù)是有條件的,當(dāng)變量的引用計數(shù)大于0時才對其做模擬恢復(fù)。同樣每個變量只能恢復(fù)一次,恢復(fù)后標記為黑,基本就是步驟 B 的逆運算。這樣剩下的一堆沒能恢復(fù)的就是該刪除的藍色節(jié)點了,在步驟 D 中遍歷出來真的刪除掉。

算法中都是模擬刪除、模擬恢復(fù)、真的刪除,都使用簡單的遍歷即可(最典型的深搜遍歷)。復(fù)雜度為執(zhí)行模擬操作的節(jié)點數(shù)正相關(guān),不只是紫色的那些疑似垃圾變量。

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

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

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

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

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

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

引用計數(shù)系統(tǒng)中的同步周期回收(ConcurrentCycleCollection)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/30169.html

相關(guān)文章

  • 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)的演化

    摘要:所有這些類型,在內(nèi)部統(tǒng)一用一個叫做的結(jié)構(gòu)表示,在源代碼中這個結(jié)構(gòu)名稱為。的具體定義在源代碼的文件中,下面是相關(guān)代碼的摘錄。 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)的演化 前言 PHP是一門托管型語言,在PHP編程中程序員不需要手工處理內(nèi)存資源的分配與釋放(使用C編寫PHP或Zend擴展除外),這就意味著PHP本身實現(xiàn)了垃圾回收機制(Garbage C...

    AdolphLWQ 評論0 收藏0
  • php底層原理之垃圾回收機制

    摘要:總結(jié)垃圾回收機制以的引用計數(shù)機制為基礎(chǔ)以前只有該機制同時使用根緩沖區(qū)機制,當(dāng)發(fā)現(xiàn)有存在循環(huán)引用的時,就會把其投入到根緩沖區(qū),當(dāng)根緩沖區(qū)達到配置文件中的指定數(shù)量后,就會進行垃圾回收,以此解決循環(huán)引用導(dǎo)致的內(nèi)存泄漏問題開始引入該機制 php垃圾回收機制,對于PHPer來說是一個不陌生但是又不是很熟悉的內(nèi)容。那么php是怎么實現(xiàn)對不需要的內(nèi)存進行回收的呢? php變量的內(nèi)部存儲結(jié)構(gòu) 首先還是...

    light 評論0 收藏0
  • PHP的生命周期

    摘要:的啟動和終止請求之前的開始階段模塊初始化階段。的生命周期單進程生命周期多進程生命周期多線程的生命周期是一種比較特殊的,容許你在語言中調(diào)用提供的函數(shù)。不太了解,明天看一下綜述理一下的生命周期,以及整個執(zhí)行過程。 PHP的架構(gòu)圖 showImg(https://segmentfault.com/img/remote/1460000013321599?w=514&h=525); SAPI S...

    sf190404 評論0 收藏0
  • PHP生命周期

    摘要:的整個生命周期被劃分為以下幾個階段模塊初始化階段請求初始化階段執(zhí)行腳本階段請求關(guān)閉階段模塊關(guān)閉階段。 PHP的整個生命周期被劃分為以下幾個階段:模塊初始化階段(module startup)、請求初始化階段(request startup)、執(zhí)行腳本階段(executescript)、請求關(guān)閉階段(request shutdown)、模塊關(guān)閉階段(module shutdown)。根據(jù)...

    wh469012917 評論0 收藏0
  • php內(nèi)核閱讀(2)--淺談 gc回收機制

    摘要:垃圾回收所謂垃圾就是指通過循環(huán)引用自己引用自己,目前只在類型中有出現(xiàn)的形式而導(dǎo)致永遠不為。當(dāng)出現(xiàn)垃圾之后,的引擎有對應(yīng)的垃圾回收機制。觸發(fā)這個機制的時機是每次出現(xiàn)減少時候。 自嘲)。。。。。2333,我覺得這是因為在php語言層面就幫我們解決了內(nèi)存回收的問題,但這讓我在和java大牛們吹牛逼的時候,聽到什么內(nèi)存泄露。。。。(納尼,我tmd怎么從來沒遇見過)一臉懵逼。 本人小菜,如果下面...

    wemallshop 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<