本文主要和大家介紹了PHP垃圾回收和記憶體管理機制詳解的具體步驟與相關操作技巧,需要的朋友可以參考下,希望能幫助到大家。
「記憶體管理機制
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>1 var_dump(memory_get_usage()); //获取内存<br>2 $a = "laruence"; //定义一个变量<br>3 var_dump(memory_get_usage()); //定义变量之后获取内存<br>4 unset($a); //删除该变量<br>5 var_dump(memory_get_usage()); //删除变量后获取内存<br></span>
##
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var_dump(memory_get_usage()); //获取内存<br>//定义100个变量for($i=0;$i<100;$i++)<br>{ $a = "test".$i;<br> $$a = "hello";<br>}//获取定义100个变量之后的内存var_dump(memory_get_usage());//定义100个变量并删除for($i=0;$i<100;$i++)<br>{ $a = "test".$i; unset($$a);<br>}//获取删除之后的内存var_dump(memory_get_usage());</span>
從上面可以看出php的記憶體管理機制是:預先給一個空間,用來儲存變量,當空間不夠時,再申請一塊新的空間。
1.儲存變數名,存在符號表。
2.變數值儲存在記憶體空間。
3.在刪除變數的時候,會將變數值儲存的空間釋放,而變數名稱所在的符號表不會減少。
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$a = 1;<br>xdebug_debug_zval('a');echo PHP_EOL;</span>
從上面可以看出,雖然刪除後記憶體變小了,但還是比沒定義變數之前時大,這是因為雖然刪除了變數的值,但變數名沒有被刪除。
php垃圾回收機制
PHP變數儲存是儲存在一個zval容器裡面的
1.類型2.值3.is_ref 代表是否有位址引用4.refcount 指向該值的變數數量
1.變數賦值的時候:is_ref為false refcount為1
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$b = $a;<br>xdebug_debug_zval('a');echo PHP_EOL;</span>
2.將變數a的值賦給變數b,變數b不會立刻去在記憶體中儲存值,而是先指向變數a的值,一直到變數a有任何操作的時候
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>$c = &$a;<br>xdebug_debug_zval('a');echo PHP_EOL;<br>xdebug_debug_zval('b');echo PHP_EOL;<br></span>
#3.因為程式又操作了變數a,所以變數b會自己申請一塊記憶體將值放進去。所以變數a的zavl容器中refcount會減1變成1,變數c指向a,所以refcount會加1變成2rrreee
##垃圾回收機制
#1.在5.2版本或之前版本,PHP會根據refcount值來判斷是不是垃圾
如果refcount值為0,PHP會當做垃圾釋放掉
這種回收機制有缺陷,對於環狀引用的變數無法回收
2.在5.3之後版本改進了垃圾回收機制############如果發現一個zval容器中的refcount在增加,表示不是垃圾# #####
如果發現一個zval容器中的refcount在減少,如果減到了0,直接當做垃圾回收
如果發現一個zval容器中的refcount在減少,並沒有減到0,PHP會把值放到緩衝區,當做有可能是垃圾的懷疑對象。
當緩衝區達到了臨界值,PHP會自動呼叫一個方法去遍歷每一個值,如果發現是垃圾就清理
以上是PHP垃圾回收與記憶體管理機制詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!