PHP內存管理機制與垃圾回收機制

PHP內存管理機制php

1 var_dump(memory_get_usage());   //獲取內存
2 $a = "laruence";                //定義一個變量
3 var_dump(memory_get_usage());   //定義變量以後獲取內存
4 unset($a);                      //刪除該變量
5 var_dump(memory_get_usage());   //刪除變量後獲取內存
6  

從上面能夠看出php的內存管理機制是:預先給出一塊空間,用來存儲變量,當空間不夠時,再申請一塊新的空間。spa

1.存儲變量名,存在符號表。debug

2.變量值存儲在內存空間。code

3.在刪除變量的時候,會將變量值存儲的空間釋放,而變量名所在的符號表不會減少。對象

var_dump(memory_get_usage());  //獲取內存
//定義100個變量
for($i=0;$i<100;$i++)
{
    $a = "test".$i;
    $$a = "hello";
}
//獲取定義100個變量以後的內存
var_dump(memory_get_usage());
//定義100個變量並刪除
for($i=0;$i<100;$i++)
{
    $a = "test".$i;
    unset($$a);
}
//獲取刪除以後的內存
var_dump(memory_get_usage());

從上面能夠看出,雖然刪除後內存變小了,但仍是比沒定義變量以前時大,這是由於雖然刪除了變量的值,但變量名沒有被刪除。blog

php垃圾回收機制內存

PHP變量存儲是存儲在一個zval容器裏面的get

1.類型 2.值 3.is_ref 表明是否有地址引用 4.refcount 指向該值的變量數量內存管理

1.變量賦值的時候:is_ref爲false  refcount爲1class

$a = 1;
xdebug_debug_zval('a');
echo PHP_EOL;

2.將變量a的值賦給變量b,變量b不會馬上去在內存中存儲值,而是先指向變量a的值,一直到變量a有任何操做的時候

$b = $a;
xdebug_debug_zval('a');
echo PHP_EOL;

3.由於程序又操做了變量a,因此變量b會本身申請一塊內存將值放進去。因此變量a的zavl容器中refcount會減1變爲1,變量c指向a,因此refcount會加1變爲2

$c = &$a;
xdebug_debug_zval('a');
echo PHP_EOL;
xdebug_debug_zval('b');
echo PHP_EOL;

垃圾回收:

1.在5.2版本或以前版本,PHP會根據refcount值來判斷是否是垃圾

若是refcount值爲0,PHP會當作垃圾釋放掉

這種回收機制有缺陷,對於環狀引用的變量沒法回收

2.在5.3以後版本改進了垃圾回收機制

若是發現一個zval容器中的refcount在增長,說明不是垃圾

若是發現一個zval容器中的refcount在減小,若是減到了0,直接當作垃圾回收

若是發現一個zval容器中的refcount在減小,並無減到0,PHP會把該值放到緩衝區,當作有多是垃圾的懷疑對象。

當緩衝區達到了臨界值,PHP會自動調用一個方法去遍歷每個值,若是發現是垃圾就清理

相關文章
相關標籤/搜索