PHP 內存管理

第一部分:內存管理

PHP不需要顯式的對內存進行管理,這些工作都由Zend引擎進行管理了。PHP內部有一個內存管理體系, 它會自動將不再使用的內存垃圾進行釋放。
當系統提示如下錯誤時,說明php已經達到了允許使用的最大內存了。

Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

一般造成內存不足的原因可能有:
一次性讀取超大文件到內存

超大的數組

循環沒有及時釋放不在使用的變量

php默認的最大使用內存是32M,可以通過php.ini 修改內存分配。

memory_limit = 128M

也可以通過php程序設置,php沒有禁用ini_set() 的時候

<?php

int_set("memory_limit", "1024M");

動態調整內存前,可以先獲取當前內存的分配和使用情況,可以通過兩個方法:

int memory_get_usage([ bool $real_usage = false ] );//返回當前分配給你的 PHP 腳本的內存量,$real_usage如果設置為 TRUE,獲取系統分配的真實內存尺寸。如果未設置或者設置為 FALSE,將是 emalloc() 報告使用的內存量。

int memory_get_peak_usage ([ bool $real_usage = false ] );//返回分配給你的 PHP 腳本的內存峰值字節數,如果設置為 TRUE 可以獲取從系統分配到的真實內存尺寸。 如果未設置,或者設置為 FALSE,僅會報告 emalloc() 使用的內存。

下面是php的內存管理器流程


06-02-01-zend-memeory-manager.jpg

]
它分為三層:存儲層(storage)、堆層(heap)和接口層(emmalloc/efree)。存儲層通過malloc()、mmap()等函數向系統申請內存,并通過freeze()函數釋放所申請的內存。儲層通常申請的內存塊都比較大,這里申請的內存大并不是指storage層結構所需要的內存大, 只是堆層通過調用存儲層的分配方法時,其以大塊大塊的方式申請的內存,存儲層的作用是將內存分配的方式對堆層透明化。

摘自:
http://www.php-internals.com/book/?p=chapt06/06-02-php-memory-manager

http://www.laruence.com/2011/03/04/1894.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容