php中的內存管理

1、php內存管理概述——Zend引擎

  1. 因爲計算機的內存由操做系統進行管理,因此普通應用程序是沒法直接對內存進行訪問的。
  2. 應用程序只能向操做系統申請內存,一般的應用也是這麼作的,在須要的時候經過相似malloc之類的庫函數 向操做系統申請內存。
  3. 在一些對性能要求較高的應用場景下是須要頻繁的使用和釋放內存的, 好比Web服務器,編程語言等,因爲向操做系統申請內存空間會引起系統調用, 系統調用和普通的應用層函數調用性能差異很是大,由於系統調用會將CPU從用戶態切換到內核, 由於涉及到物理內存的操做,只有操做系統才能進行,而這種切換的成本是很是大的, 若是頻繁的在內核態和用戶態之間切換會產生性能問題。
  4. 鑑於系統調用的開銷,一些對性能有要求的應用一般會本身在用戶態進行內存管理, 例如第一次申請稍大的內存留着備用,而使用完釋放的內存並非立刻歸還給操做系統, 能夠將內存進行復用,這樣能夠避免屢次的內存申請和釋放所帶來的性能消耗。
  5. PHP不須要顯式的對內存進行管理,這些工做都由Zend引擎進行管理了。PHP內部有一個內存管理體系, 它會自動將再也不使用的內存垃圾進行釋放。

2、php中查看與設置內存的相關參數與函數

  1. 配置內存大小:php

    (1)php.ini中能夠更改配置memory_limit = 32M
    (2)若環境中沒有禁用ini_set()函數,能夠經過此函數設置:ini_set("memory_limit", "128M");
  2. 查看內存狀況:編程

    (1)memory_get_usage(),這個函數的做用是獲取 目前PHP腳本所用的內存大小。
    (2)memory_get_peak_usage(),這個函數的做用返回 當前腳本到目前位置所佔用的內存峯值,這樣就可能獲取到目前的腳本的內存需求狀況。

3、ZendMM內存分配和銷燬

  1. PHP底層對內存的管理, 圍繞着小塊內存列表(free_buckets)、 大塊內存列表(large_free_buckets)和 剩餘內存列表(rest_buckets)三個列表來分層進行的。
  2. ZendMM向系統進行的內存申請,並非有須要時向系統即時申請, 而是由ZendMM的最底層(heap層)先向系統申請一大塊的內存,經過對上面三種列表的填充, 創建一個相似於內存池的管理機制。
  3. 在程序運行須要使用內存的時候,ZendMM會在內存池中分配相應的內存供使用。 這樣作的好處是避免了PHP向系統頻繁的內存申請操做。
  4. ZendMM在內存銷燬的處理上採用與內存申請相同的策略,當程序unset一個變量或者是其餘的釋放行爲時, ZendMM並不會直接馬上將內存交回給系統,而是隻在自身維護的內存池中將其從新標識爲可用, 按照內存的大小整理到上面所說的三種列表(small,large,free)之中,以備下次內存申請時使用。
  5. 具體的詳情可參考:http://www.php-internals.com/...
相關文章
相關標籤/搜索