首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP memory_get_usage() 數值波動大原因分析:記憶體管理、GC 與監控建議

     編輯:PHP 相關知識

現象

同一頁面、同一資料,memory_get_usage() 回傳值時而 700KB、時而 1.5MB、時而 5MB,重啟 Apache 後恢復正常。

根本原因

  1. PHP 記憶體管理機制:PHP 向 OS 申請大塊記憶體(Chunk),內部自行分配。memory_get_usage(true) 回傳向 OS 申請總量,false(預設)回傳實際使用量。兩者差異大時表示內部碎片多。
  2. 請求間記憶體未釋放:模組模式(mod_php)或 PHP-FPM 重用進程,若有循環引用、靜態變數持有大物件、擴充套件洩漏,記憶體會隨請求數遞增。
  3. Garbage Collection (GC) 觸發時機:PHP 5.3+ 引入 GC,預設 10,000 個根節點觸發。若 GC 未跑,記憶體佔用會暫時偏高。
  4. OpCache 內部快取:OpCache 儲存編譯後 opcode、類別表、函式表,佔用共享記憶體,不計入 memory_get_usage,但進程總 RSS 會增加。

監控與分析工具

工具用途
memory_get_usage(true)即時觀察向 OS 申請量
memory_get_peak_usage()請求峰值記憶體
Xdebug + Webgrind函式級記憶體分析
Blackfire.io生產級效能剖析、記憶體時間軸
pmap / ps auxOS 層面進程 RSS、共享/私有記憶體

緩解與解決策略

  • 啟用 GC 並調整閾值:gc_enable(); gc_collect_cycles(); 在關鍵點強制回收。
  • 避免大陣列/物件常駐靜態變數:請求結束前 unset() 或改用快取服務。
  • PHP-FPM 進程回收:pm.max_requests = 500 定期重啟 Worker 釋放記憶體。
  • 檢查擴充套件洩漏:停用可疑擴充(如 xdebug、mongodb、redis)觀察差異。
  • 升級 PHP 版本:PHP 8.x 記憶體管理顯著優化(內部字串重用、JIT、GC 改良)。

結語

memory_get_usage() 波動屬正常現象,關鍵在於「趨勢」而非單點數值。持續成長趨勢暗示洩漏,請善用 memory_get_peak_usage、Xdebug、Blackfire 定位,並透過 PHP-FPM 進程回收、GC 調優、升級 PHP 版本根治。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved