淺談PHP內存分配管理機制

下面先看一下內存的一些變化過程:

淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin

淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin

爲什麼,unset釋放內存後,與第一次輸出的不一樣呢。其實是輸出函數佔用了部分內存。
下面我們在看下:

淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin
 
淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin
 
這樣內存就相同了。。

PHP的unset確實會釋放內存(當然, 還要結合引用和計數), 但這個釋放不是C編程意義上的釋放, 不是交回給OS。對於PHP來說, 它自身提供了一套和C語言對內存分配相似的內存管理API。

淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin
 
這些API和C的API意義對應, 在PHP內部都是通過這些API來管理內存的。

當我們調用emalloc申請內存的時候,PHP並不是簡單的向OS要內存,而是會像OS要一個大塊的內存,然後把其中的一塊分配給申請者, 這樣當再有邏輯來申請內存的時候,就不再需要向OS申請內存了,避免了頻繁的系統調用。

eg:
淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin
 
淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin
 
 也就是我們在定義變量$string 時,PHP並沒有向系統申請新的內存。

同樣的, 在我們調用efree釋放內存的時候, PHP也不會把內存還給OS,,而會把這塊內存,,歸入自己維護的空閒內存列表.,而對於小塊內存來說,,更可能的是, 把它放到內存緩存列表中去。

關於數組的內存分配:
Hashtable是PHP的核心結構,數組也是用它來表示的,而符號表也是一種關聯數組, 對於如下代碼:

淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin

我們定義了100個變量, 然後又Unset了他們,,來看看輸出:
 
淺談PHP內存分配管理機制 - kaizhu_QIN - kaizhu_Qin

這是因爲對於Hashtable來說,定義它的時候,不可能一次性分配足夠多的內存塊,來保存未知個數的元素,,所以PHP會在初始化的時候, 只是分配一小部分內存塊給HashTable,,當不夠用的時候再RESIZE擴容。

而Hashtable, 只能擴容,不會減少,對於上面的例子,當我們存入100個變量的時候, 符號表不夠用了,做了一次擴容, 而當我們依次unset掉這100個變量以後,變量佔用的內存是釋放了(334172– 325752),但是符號表並沒有縮小,所以這些少的內存是被符號表本身佔去了....
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章