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

資訊專(zhuān)欄INFORMATION COLUMN

PHP的垃圾回收機(jī)制-引用計(jì)數(shù)基本知識(shí)(5.3)

dreambei / 2580人閱讀

摘要:后者的例子在給巨大的一個(gè)知名的組件庫(kù)的模板組件做單元測(cè)試時(shí),就可能會(huì)出現(xiàn)問(wèn)題。

PHP的垃圾回收機(jī)制

垃圾回收器,全稱(chēng)Garbage Collection,簡(jiǎn)稱(chēng)GC,5.3版本之前 只是簡(jiǎn)單判斷變量的zval的refcount是否為0,是的話就釋放,不是直至進(jìn)程結(jié)束(隱藏著變量?jī)?nèi)存溢出的風(fēng)險(xiǎn)).

如果你已經(jīng)安裝了? Xdebug,你能通過(guò)調(diào)用函數(shù) xdebug_debug_zval()顯示"refcount"和"is_ref"的值。

引用計(jì)數(shù)基本知識(shí) 1、一個(gè)zval變量容器:
內(nèi)容
類(lèi)型
is_ref 是個(gè)bool值,用來(lái)標(biāo)識(shí)這個(gè)變量是否是屬于引用集合(reference set) zval變量容器中還有一個(gè)內(nèi)部引用計(jì)數(shù)機(jī)制,來(lái)優(yōu)化內(nèi)存使用
refcount 指向這個(gè)zval變量容器的變量(也稱(chēng)符號(hào)即symbol)個(gè)數(shù) 所有的符號(hào)存在一個(gè)符號(hào)表中,其中每個(gè)符號(hào)都有作用域(scope),那些主腳本(比如:通過(guò)瀏覽器請(qǐng)求的的腳本)和每個(gè)函數(shù)或者方法也都有作用域。

當(dāng)一個(gè)變量被賦常量值時(shí),就會(huì)生成一個(gè)zval變量容器

1、 生成一個(gè)新的zval容器

參考上面的定義,分別是:

生成的變量容器,其中:

類(lèi)型 string

值 new string

is_ref false

Refcount 1

2、增加一個(gè)zval的引用計(jì)數(shù)

把一個(gè)變量賦值給另一變量將增加引用次數(shù)(refcount).

類(lèi)型 string

值 new string

is_ref true

Refcount 2

引用次數(shù)是2,因?yàn)橥粋€(gè)變量容器被變量 a 和變量 b關(guān)聯(lián).當(dāng)沒(méi)必要時(shí),php不會(huì)去復(fù)制已生成的變量容器。變量容器在”refcount“變成0時(shí)就被銷(xiāo)毀. 當(dāng)任何關(guān)聯(lián)到某個(gè)變量容器的變量離開(kāi)它的作用域(比如:函數(shù)執(zhí)行結(jié)束),或者對(duì)變量調(diào)用了函數(shù) unset()時(shí),”refcount“就會(huì)減1.

3、 減少引用計(jì)數(shù)


a: (refcount=3, is_ref=0)="new string"
a: (refcount=1, is_ref=0)="new string"

如果我們現(xiàn)在執(zhí)行 unset($a);,包含類(lèi)型和值的這個(gè)變量容器就會(huì)從內(nèi)存中刪除。

4、復(fù)合類(lèi)型(Compound Types) ?

當(dāng)考慮像 array和object這樣的復(fù)合類(lèi)型時(shí),事情就稍微有點(diǎn)復(fù)雜. 與 標(biāo)量(scalar)類(lèi)型的值不同,array和 object類(lèi)型的變量把它們的成員或?qū)傩源嬖谧约旱姆?hào)表中。這意味著下面的例子將生成三個(gè)zval變量容器。

 "life", "number" => 42 );
xdebug_debug_zval( "a" );
?>

輸出

a: (refcount=1, is_ref=0)=array (
   "meaning" => (refcount=1, is_ref=0)="life",
   "number" => (refcount=1, is_ref=0)=42
)

看圖說(shuō)話

這三個(gè)zval變量容器是: a,meaning和 number。增加和減少”refcount”的規(guī)則和上面提到的一樣. 下面, 我們?cè)跀?shù)組中再添加一個(gè)元素,并且把它的值設(shè)為數(shù)組中已存在元素的值:

添加一個(gè)已經(jīng)存在的元素到數(shù)組中

 "life", "number" => 42 );
$a["life"] = $a["meaning"];
xdebug_debug_zval( "a" );
?>

輸出

a: (refcount=1, is_ref=0)=array (
   "meaning" => (refcount=2, is_ref=0)="life",
   "number" => (refcount=1, is_ref=0)=42,
   "life" => (refcount=2, is_ref=0)="life"
)

有圖有真相

從以上的xdebug輸出信息,我們看到原有的數(shù)組元素和新添加的數(shù)組元素關(guān)聯(lián)到同一個(gè)"refcount"2的zval變量容器. 盡管 Xdebug的輸出顯示兩個(gè)值為"life"的 zval 變量容器,其實(shí)是同一個(gè)。 函數(shù)xdebug_debug_zval()不顯示這個(gè)信息,但是你能通過(guò)顯示內(nèi)存指針信息來(lái)看到。

刪除數(shù)組中的一個(gè)元素,就是類(lèi)似于從作用域中刪除一個(gè)變量. 刪除后,數(shù)組中的這個(gè)元素所在的容器的“refcount”值減少,同樣,當(dāng)“refcount”為0時(shí),這個(gè)變量容器就從內(nèi)存中被刪除,下面又一個(gè)例子可以說(shuō)明:

 "life", "number" => 42 );
$a["life"] = $a["meaning"];
unset( $a["meaning"], $a["number"] );
xdebug_debug_zval( "a" );
?>

輸出

a: (refcount=1, is_ref=0)=array (
   "life" => (refcount=1, is_ref=0)="life"
)

現(xiàn)在,當(dāng)我們添加一個(gè)數(shù)組本身作為這個(gè)數(shù)組的元素時(shí),事情就變得有趣,下個(gè)例子將說(shuō)明這個(gè)。例中我們加入了引用操作符,否則php將生成一個(gè)復(fù)制。

把數(shù)組作為一個(gè)元素添加到自己

輸出

a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)="one",
   1 => (refcount=2, is_ref=1)=...
)

看圖說(shuō)話

能看到數(shù)組變量 (a) 同時(shí)也是這個(gè)數(shù)組的第二個(gè)元素(1) 指向的變量容器中“refcount”為 2。上面的輸出結(jié)果中的"..."說(shuō)明發(fā)生了遞歸操作, 顯然在這種情況下意味著"..."指向原始數(shù)組。

跟剛剛一樣,對(duì)一個(gè)變量調(diào)用unset,將刪除這個(gè)符號(hào),且它指向的變量容器中的引用次數(shù)也減1。所以,如果我們?cè)趫?zhí)行完上面的代碼后,對(duì)變量$a調(diào)用unset, 那么變量 $a 和數(shù)組元素 "1" 所指向的變量容器的引用次數(shù)減1, 從"2"變成"1". 下例可以說(shuō)明:


輸出

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)="one",
   1 => (refcount=1, is_ref=1)=...
)

看圖說(shuō)話

2、清理變量容器的問(wèn)題(Cleanup Problems) ?

盡管不再有某個(gè)作用域中的任何符號(hào)指向這個(gè)結(jié)構(gòu)(就是變量容器),由于數(shù)組元素“1”仍然指向數(shù)組本身,所以這個(gè)容器不能被清除 。因?yàn)闆](méi)有另外的符號(hào)指向它,用戶沒(méi)有辦法清除這個(gè)結(jié)構(gòu),結(jié)果就會(huì)導(dǎo)致內(nèi)存泄漏。慶幸的是,php將在腳本執(zhí)行結(jié)束時(shí)清除這個(gè)數(shù)據(jù)結(jié)構(gòu),但是在php清除之前,將耗費(fèi)不少內(nèi)存。如果你要實(shí)現(xiàn)分析算法,或者要做其他像一個(gè)子元素指向它的父元素這樣的事情,這種情況就會(huì)經(jīng)常發(fā)生。當(dāng)然,同樣的情況也會(huì)發(fā)生在對(duì)象上,實(shí)際上對(duì)象更有可能出現(xiàn)這種情況,因?yàn)閷?duì)象總是隱式的被引用。

如果上面的情況發(fā)生僅僅一兩次倒沒(méi)什么,但是如果出現(xiàn)幾千次,甚至幾十萬(wàn)次的內(nèi)存泄漏,這顯然是個(gè)大問(wèn)題。這樣的問(wèn)題往往發(fā)生在長(zhǎng)時(shí)間運(yùn)行的腳本中,比如請(qǐng)求基本上不會(huì)結(jié)束的守護(hù)進(jìn)程(deamons)或者單元測(cè)試中的大的套件(sets)中。后者的例子:在給巨大的eZ(一個(gè)知名的PHP Library) 組件庫(kù)的模板組件做單元測(cè)試時(shí),就可能會(huì)出現(xiàn)問(wèn)題。有時(shí)測(cè)試可能需要耗用2GB的內(nèi)存,而測(cè)試服務(wù)器很可能沒(méi)有這么大的內(nèi)存。

PHP手冊(cè)

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

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

相關(guān)文章

  • PHPer面試指南-PHP

    摘要:本書(shū)的地址篇收集了一些常見(jiàn)的基礎(chǔ)進(jìn)階面試題,基礎(chǔ)的面試題不再作答。如何實(shí)現(xiàn)持久化持久化,將在內(nèi)存中的的狀態(tài)保存到硬盤(pán)中,相當(dāng)于備份數(shù)據(jù)庫(kù)狀態(tài)。相當(dāng)于備份數(shù)據(jù)庫(kù)接收到的命令,所有被寫(xiě)入的命令都是以的協(xié)議格式來(lái)保存的。 本書(shū)的 GitHub 地址:https://github.com/todayqq/PH... PHP 篇收集了一些常見(jiàn)的基礎(chǔ)、進(jìn)階面試題,基礎(chǔ)的面試題不再作答。 基礎(chǔ)篇 ...

    stackvoid 評(píng)論0 收藏0
  • 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)演化

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

    AdolphLWQ 評(píng)論0 收藏0
  • PHP回收周期

    摘要:原文回收周期,增加一篇論文在底部。就是說(shuō),僅僅在引用計(jì)數(shù)減少到非零值時(shí),才會(huì)產(chǎn)生垃圾周期。如果他們是循環(huán)引用周期的一部分,將永不能被清除進(jìn)而導(dǎo)致內(nèi)存泄漏。這個(gè)函數(shù)將返回使用這個(gè)算法回收的周期數(shù)。引用計(jì)數(shù)系統(tǒng)中的同步周期回收 原文:回收周期(Collecting Cycles) ,增加一篇論文在底部。 以下過(guò)程僅對(duì)數(shù)組和對(duì)象類(lèi)型起作用。 傳統(tǒng)上,像以前的 php 用到的引用計(jì)數(shù)內(nèi)存機(jī)制,...

    Astrian 評(píng)論0 收藏0
  • 能讓你更早下班Python垃圾回收機(jī)制

    摘要:內(nèi)部通過(guò)引用計(jì)數(shù)機(jī)制來(lái)統(tǒng)計(jì)一個(gè)對(duì)象被引用的次數(shù)。下一步,就該被我們的垃圾回收器給收走了。而我們垃圾回收機(jī)制只有當(dāng)引用計(jì)數(shù)為的時(shí)候才會(huì)釋放對(duì)象。以空間換時(shí)間的方法提高垃圾回收效率。 人生苦短,只談風(fēng)月,談什么垃圾回收。據(jù)說(shuō)上圖是某語(yǔ)言的垃圾回收機(jī)制。。。我們寫(xiě)過(guò)C語(yǔ)言、C++的朋友都知道,我們的C語(yǔ)言是沒(méi)有垃圾回...

    pumpkin9 評(píng)論0 收藏0
  • PHP垃圾回收機(jī)制

    摘要:在中算法,當(dāng)節(jié)點(diǎn)緩沖區(qū)滿了之后,垃圾分析算法就會(huì)啟動(dòng),并且會(huì)釋放掉發(fā)現(xiàn)的垃圾,從而回收內(nèi)存。在編程中程序員不需要手動(dòng)處理內(nèi)存資源分配與釋放,意味著本身實(shí)現(xiàn)了垃圾回收處理機(jī)制。 PHP是一種弱類(lèi)型的腳本語(yǔ)言,弱類(lèi)型不表示PHP變量沒(méi)有類(lèi)型的區(qū)別,PHP變量有8種原始類(lèi)型:四種標(biāo)量類(lèi)型: boolean(布爾值) integer(整型) float(浮點(diǎn)型) 兩種復(fù)合類(lèi)型: arra...

    luck 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<