php如何管理記憶體

(*-*)浩
發布: 2023-02-24 14:26:01
原創
1815 人瀏覽過

記憶體管理一般會包含以下內容:

php如何管理記憶體

#是否有足夠的記憶體供我們的程序使用;

如何從足夠可用的記憶體中獲取部分記憶體;

對於使用後的內存,是否可以將其銷毀並將其重新分配給其它程式使用。 (推薦學習:PHP程式設計從入門到精通

與此對應,PHP的記憶體管理也包含這樣的內容,只是這些內存在ZEND核心中是以宏的形式作為介面提供給外部使用。 

後面兩個運算分別對應emalloc宏,efree宏,而第一個運算可以根據emalloc宏回傳結果來偵測。

PHP的記憶體管理可以被看作是分層(hierarchical)的。它分為三層:儲存層(storage)、堆層(heap)和介面層(emalloc/efree)。 

儲存層透過 malloc()、mmap() 等函數向系統真正的申請內存,並透過 free() 函數釋放所申請的記憶體。儲存層通常申請的記憶體區塊都比較大,這裡申請的記憶體大並不是指storage層結構所需要的記憶體大, 只是堆層透過呼叫儲存層的分配方法時,其以大塊大塊的方式申請的內存,存儲層的作用是將內存分配的方式對堆層透明化。

如圖所示,PHP記憶體管理器。 PHP在儲存層共有4種記憶體分配方案: malloc,win32,mmap_anon,mmap_zero, 預設使用malloc分配內存,如果設定了ZEND_WIN32宏,則為windows版本,呼叫HeapAlloc分配內存, 剩下兩種記憶體方案為匿名記憶體映射,並且PHP的記憶體方案可以透過設定環境變數來修改。

php如何管理記憶體

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

从上面可以看出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());


从上面可以看出,虽然删除后内存变小了,但还是比没定义变量之前时大,这是因为虽然删除了变量的值,但变量名没有被删除。

php垃圾回收机制

PHP变量存储是存储在一个zval容器里面的

1.类型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向该值的变量数量

1.变量赋值的时候:is_ref为false  refcount为1

$a = 1;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;

2.将变量a的值赋给变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候

$b = $a;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;

3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去。所以变量a的zavl容器中refcount会减1变为1,变量c指向a,所以refcount会加1变为2

$c = &$a;
xdebug_debug_zval(&#39;a&#39;);
echo PHP_EOL;
xdebug_debug_zval(&#39;b&#39;);
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
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板