日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php程序内存空间,php如何管理内存

發布時間:2025/3/15 php 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php程序内存空间,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內存管理機制

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('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如何管理内存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。