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;
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會自動呼叫一個方法去遍歷每一個值,如果發現是垃圾就清理更多相關問題請訪問PHP中文網:以上是什麼是PHP記憶體管理機制與垃圾回收機制?該如何理解?的詳細內容。更多資訊請關注PHP中文網其他相關文章!