您好,登錄后才能下訂單哦!
鳥(niǎo)哥的博客是個(gè)大寶庫(kù),正在從頭看起。
《深入理解PHP內(nèi)存管理之誰(shuí)動(dòng)了我的內(nèi)存》
http://www.laruence.com/2011/03/04/1894.html
1、memory_get_usage 函數(shù)
int memory_get_usage ([ bool $real_usage = false ] )
PHP腳本使用的內(nèi)存(不含 memory_get_usage() 函數(shù)本身占用的內(nèi)存)
memory_get_usage()的參數(shù)$real_usage,默認(rèn)為 FALSE;當(dāng)設(shè)置為 TRUE 時(shí),得到的內(nèi)存值為PHP 內(nèi)存管理占用的內(nèi)存。
//php分配到的內(nèi)存 var_dump(memory_get_usage(true)); //php使用內(nèi)內(nèi)存 var_dump(memory_get_usage());
結(jié)果
int 262144
int 239368
PHP的內(nèi)存管理機(jī)制是:預(yù)先分配一塊空間,用來(lái)存儲(chǔ)變量,當(dāng)空間不夠時(shí),再申請(qǐng)一塊新的空間。
memory_get_usage(true)即為預(yù)先分配的內(nèi)存。
之前沒(méi)有注意過(guò)PHP頁(yè)面的內(nèi)存使用,以后優(yōu)化頁(yè)面時(shí)候也應(yīng)該用這個(gè)函數(shù)來(lái)分析代碼。
2、變量賦值和內(nèi)存
var_dump(memory_get_usage()); $a = "Hello World"; var_dump(memory_get_usage()); $b = $a; var_dump(memory_get_usage()); unset($b); var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
結(jié)果
int 239776
int 239912
int 240000
int 239912
int 239776
239912-239776=136
240000-239912=88
$a和$b賦值所使用的內(nèi)存不同,原因是$b賦值并沒(méi)有分配內(nèi)存,這88個(gè)字節(jié)是輸出函數(shù)占用的。
另外銷(xiāo)毀$b,并不影響$a使用的內(nèi)存,這個(gè)是內(nèi)存管理引用計(jì)數(shù)的原因
改一下例子就能很清楚的了解變量賦值和內(nèi)存的關(guān)系
var_dump(memory_get_usage()); $a = "Hello World"; var_dump(memory_get_usage()); $b = "Hello World"; var_dump(memory_get_usage()); unset($b); var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
結(jié)果
int 239816
int 239952
int 240088
int 239952
int 239816
239952-239816=136
240088-239952=136
另外引用賦值占用內(nèi)存規(guī)則和直接賦值相似,這也涉及到內(nèi)存管理的引用計(jì)數(shù)規(guī)則
3、php垃圾回收機(jī)制,這部分了解的還不夠深入,簡(jiǎn)單記錄一個(gè)函數(shù)
xdebug_debug_zval 需要安裝xdebug擴(kuò)展
$a = "Hello World"; xdebug_debug_zval('a');
輸出
a:
(refcount=1, is_ref=0),string 'Hello World' (length=11)
refcount 指向該值的變量數(shù)量
is_ref 代表是否有地址引用
類(lèi)型
值
變量賦值的時(shí)候:is_ref為false refcount為1
手冊(cè)地址
引用計(jì)數(shù)的基本知識(shí)
http://php.net/manual/zh/features.gc.refcounting-basics.php
每個(gè)php變量存在一個(gè)叫"zval"的變量容器中。一個(gè)zval變量容器,除了包含變量的類(lèi)型和值,還包括兩個(gè)字節(jié)的額外信息。第一個(gè)是"is_ref",是個(gè)bool值,用來(lái)標(biāo)識(shí)這個(gè)變量是否是屬于引用集合(reference
set)。通過(guò)這個(gè)字節(jié),php引擎才能把普通變量和引用變量區(qū)分開(kāi)來(lái),由于php允許用戶(hù)通過(guò)使用&來(lái)使用自定義引用,zval變量容器中還有一個(gè)內(nèi)部引用計(jì)數(shù)機(jī)制,來(lái)優(yōu)化內(nèi)存使用。第二個(gè)額外字節(jié)是"refcount",用以表示指向這個(gè)zval變量容器的變量(也稱(chēng)符號(hào)即symbol)個(gè)數(shù)。所有的符號(hào)存在一個(gè)符號(hào)表中,其中每個(gè)符號(hào)都有作用域(scope),那些主腳本(比如:通過(guò)瀏覽器請(qǐng)求的的腳本)和每個(gè)函數(shù)或者方法也都有作用域。
以上翻看鳥(niǎo)哥的11年的blog文章,對(duì)PHP的變量和內(nèi)存管理有了一個(gè)初步的認(rèn)識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。