一、記憶體管理基礎
用c語言開發時,開發者要手動進行記憶體管理。php經常作為web伺服器的模組,記憶體管理與預防記憶體洩露緊密關聯。另外php可能用於執行緒環境中,所以全域性變數可能導致競爭情況。此外zend引擎面對乙個十分特殊的使用模式:在一段比較短的時間內,許多zval結構大小的記憶體塊和其他的小記憶體塊被申請又再被釋放,php的記憶體管理也很重視memory_limit(記憶體限制)
為了滿足以上的需求,zend引擎提供了為了處理請求相關資料提供了一種特殊的記憶體管理器。請求相關資料是指只需要服務於單個請求,最遲在請求結束時釋放的資料。擴充套件開發者主要接觸下表中列出的慣例,雖然一些所提供的便捷功能使用巨集實現的,但是本文中會像函式一樣對待。
如上所述,防止有記憶體洩露並盡可能快的釋放所有記憶體是記憶體管理的重要組成部分。因為安全原因,在請求結束時,zend引擎會釋放所有由上面提到的api所分配的記憶體。如果php使用--enable-debug配置選項進行構建,這將產生乙個警告
當使用php變數時,需要確認變數的記憶體要使用emalloc來分配,並注意引用計數。
記憶體洩漏檢測僅可以發現由 emalloc 分配記憶體塊導致的洩漏。為進行深層分析,建議使用記憶體檢測器,如 valgrind 或 libumem 等。要簡化此分析,可在 php 啟動時通過設定環境變數 use_zend_alloc=0 來禁用 php 的記憶體管理器。
(以上是php官網中文內容)
二、資料持久化
持久化記憶體通常用在持久化資料庫連線上,雖然實踐起來並不好,但依然是最常使用的特性。
注意:下面所有函式採取額外的持久化引數應該是false,引擎將用常規的分配器(emalloc),記憶體不應該是 considered persistent(不會翻譯!)。作為持久化的記憶體,系統呼叫分配器,正像主要的記憶體api一樣在大多數情況下它們仍然不返回空指標
警告:需要注意被分配用來持久化的記憶體不是最優化的或者是被zend引擎跟蹤的,它不被memory_limit所限制,另外,所有通過the hacker建立的變數一定不能被用來持久化記憶體。
(翻譯的真爛!)
PHP核心研究 記憶體管理1
memory limit 32m或者採用動態方式修改最大記憶體 ini set memory limit 128m 修改記憶體為128m memory get usage 目前php指令碼所用的記憶體大小 memory get peak usage 返回當前位置占用記憶體峰值,這樣就可以知道記憶體峰...
PHP記憶體管理
var dump memory get usage a laruence var dump memory get usage unset a var dump memory get usage 輸出 在我的個人電腦上,可能會因為系統,php版本,載入的擴充套件不同而不同 int 90440 int ...
Linux核心剖析 核心的記憶體管理
核心的記憶體管理不同於使用者空間的記憶體管理,首先來講核心本身的限制點就比較多,比如核心一般不能睡眠,因此處理記憶體錯誤一般來講是件很困難的事情,再加上其他限制以及核心記憶體機制不能太複雜導致想獲取核心記憶體變成了一件難事。在說核心的記憶體管理機制之前,首先我們得明白核心記憶體管理的基本單位才行,一...