首頁  >  文章  >  後端開發  >  PHP垃圾回收與記憶體管理機制詳解

PHP垃圾回收與記憶體管理機制詳解

零到壹度
零到壹度原創
2018-03-20 09:24:511661瀏覽

本文主要和大家介紹了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn