首頁  >  文章  >  後端開發  >  什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?

什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?

王林
王林轉載
2019-08-24 10:14:462345瀏覽

PHP記憶體管理機制

var_dump(memory_get_usage());   //获取内存
$a = "laruence";                //定义一个变量
var_dump(memory_get_usage());   //定义变量之后获取内存
unset($a);                      //删除该变量
var_dump(memory_get_usage());   //删除变量后获取内存

輸出結果:

int 262144
int 262144
int 262144

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

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

2.變數值儲存在記憶體空間。

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());

輸出結果:

int 240040
int 257680
int 240856

從上面可以看出,雖然刪除後記憶體變小了,但還是比沒定義變數之前時大,這是因為雖然刪除了變數的值,但變數名沒有被刪除。

php垃圾回收機制

PHP變數儲存是儲存在一個zval容器裡面的

1.型別2.值3.is_ref 代表是否有位址引用4.refcount指向該值的變數數量

1.變數賦值的時候:is_ref為false  refcount為1

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

什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?

2.將變數a的值賦給變數b,變數b不會立刻去在記憶體中儲存值,而是先指向變數a的值,一直到變數a有任何操作的時候

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

什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?

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;

什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?

##垃圾回收:

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

如果refcount值為0,PHP會當做垃圾釋放掉

#這種回收機制有缺陷,對於環狀引用的變數無法回收

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

如果發現一個zval容器中的refcount在增加,說明不是垃圾

如果發現一個zval容器中的refcount在減少,如果減到了0,直接當做垃圾回收

#如果發現一個zval容器中的refcount在減少,並沒有減到0,PHP會把該值放到緩衝區,當做有可能是垃圾的懷疑對象。

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

更多相關問題請訪問PHP中文網:

PHP實戰影片教學

以上是什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除