PHP内存管理机制与垃圾回收机制
轉載:https://www.cnblogs.com/zk0533/p/5667122.html
PHP內存管理機制
var_dump(memory_get_usage()); //獲取內存 $a = "laruence"; //定義一個變量 var_dump(memory_get_usage()); //定義變量之后獲取內存 unset($a); //刪除該變量 var_dump(memory_get_usage()); //刪除變量后獲取內存 E:\code\tp\public\_memory.php:9:int 385048 E:\code\tp\public\_memory.php:11:int 385048 E:\code\tp\public\_memory.php:13:int 385048從上面可以看出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()); E:\code\tp\public\_memory.php:16:int 386664 E:\code\tp\public\_memory.php:24:int 391368 E:\code\tp\public\_memory.php:32:int 388992從上面可以看出,雖然刪除后內存變小了,但還是比沒定義變量之前時大,這是因為雖然刪除了變量的值,但變量名沒有被刪除。
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; a: (refcount=0, is_ref=0)int 12.將變量a的值賦給變量b,變量b不會立刻去在內存中存儲值,而是先指向變量a的值,一直到變量a有任何操作的時候
$b = $a; xdebug_debug_zval('a'); echo PHP_EOL; a: (refcount=0, is_ref=0)int 13.因為程序又操作了變量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; a: (refcount=2, is_ref=1)int 1 b: (refcount=0, is_ref=0)int 1垃圾回收:
1.在5.2版本或之前版本,PHP會根據refcount值來判斷是不是垃圾
如果refcount值為0,PHP會當做垃圾釋放掉
這種回收機制有缺陷,對于環狀引用的變量無法回收
2.在5.3之后版本改進了垃圾回收機制
如果發現一個zval容器中的refcount在增加,說明不是垃圾
如果發現一個zval容器中的refcount在減少,如果減到了0,直接當做垃圾回收
如果發現一個zval容器中的refcount在減少,并沒有減到0,PHP會把該值放到緩沖區,當做有可能是垃圾的懷疑對象。
當緩沖區達到了臨界值,PHP會自動調用一個方法去遍歷每一個值,如果發現是垃圾就清理
轉載于:https://www.cnblogs.com/jiangxiaobo/p/11063106.html
總結
以上是生活随笔為你收集整理的PHP内存管理机制与垃圾回收机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis最新官方下载地址
- 下一篇: PHP实现高并发下的秒杀功能–Larav