下面先看一下內存的一些變化過程:
爲什麼,unset釋放內存後,與第一次輸出的不一樣呢。其實是輸出函數佔用了部分內存。
下面我們在看下:
這樣內存就相同了。。
PHP的unset確實會釋放內存(當然, 還要結合引用和計數), 但這個釋放不是C編程意義上的釋放, 不是交回給OS。對於PHP來說, 它自身提供了一套和C語言對內存分配相似的內存管理API。
這些API和C的API意義對應, 在PHP內部都是通過這些API來管理內存的。
當我們調用emalloc申請內存的時候,PHP並不是簡單的向OS要內存,而是會像OS要一個大塊的內存,然後把其中的一塊分配給申請者, 這樣當再有邏輯來申請內存的時候,就不再需要向OS申請內存了,避免了頻繁的系統調用。
eg:
同樣的, 在我們調用efree釋放內存的時候, PHP也不會把內存還給OS,,而會把這塊內存,,歸入自己維護的空閒內存列表.,而對於小塊內存來說,,更可能的是, 把它放到內存緩存列表中去。
關於數組的內存分配:
Hashtable是PHP的核心結構,數組也是用它來表示的,而符號表也是一種關聯數組, 對於如下代碼:
我們定義了100個變量, 然後又Unset了他們,,來看看輸出:
這是因爲對於Hashtable來說,定義它的時候,不可能一次性分配足夠多的內存塊,來保存未知個數的元素,,所以PHP會在初始化的時候, 只是分配一小部分內存塊給HashTable,,當不夠用的時候再RESIZE擴容。
而Hashtable, 只能擴容,不會減少,對於上面的例子,當我們存入100個變量的時候, 符號表不夠用了,做了一次擴容, 而當我們依次unset掉這100個變量以後,變量佔用的內存是釋放了(334172– 325752),但是符號表並沒有縮小,所以這些少的內存是被符號表本身佔去了....