PHP的底層代碼是由C/C++語言來編寫的,PHP的內存管理器的架構以下:php
存儲層(storage)
這一層是內存申請,ZendMM向系統進行的內存申請,並非有須要時向系統即時申請,而是由Z恩典MM的最底層(heap層)先向系統申請一大塊的內存,經過對上面三種列表的填充,創建一個相似於內存池的管理機制。在程序再須要使用內存的時候,ZendMM會在內存池中分配相應的內存供使用。這樣作的好處是避免了PHP向系統頻繁的內存操做。程序員
堆層(heap)
這一層是初始化內存,PHP內存管理主要維護三個列表:算法
1)、小塊內存列表free_buckets架構
2)、大塊內存列表large_free_bucketside
3)、剩餘內存列表rest_buckets性能
接口層
就是一些宏定義,主要是咱們本身編寫的一些應用程序spa
內存的銷燬
ZendMM在內存銷燬的處理上採用與內存申請相同的策略,當程序unset一個變量或者是其餘的釋放行爲時,ZendMM並不會直接馬上將內存交回給系統,而是隻在自身維護的內存池中將其從新標識爲可用,按照內存的大小整理到上面所說的三種列表(small、large、free)之中,已被下次內存申請時使用。.net
程序使用的全部內存,將在進程結束時統一交還給系統。線程
=================================================================rest
垃圾回收
自動回收內存的過程叫垃圾收集。PHP提供了語言層的垃圾回收機制,讓程序員沒必要過度關心程序內存分配。
PHP5.3以前
引用計數方式的內存動態管理
PHP中全部的變量都是zval變量的形式存在。
變量引用計數變爲0時,PHP將在內存中銷燬這個變量,而且PHP在一個生命週期結束後就會釋放此進程/線程所佔的內容
PHP5.3以後的垃圾回收
垃圾收集機制基於PHP的動態內存管理而存在。PHP5.3以後爲引入垃圾收集機制,在變量存儲的基本結構上有一些變更
它使用的是一種同步回收的算法。
在PHP官方文檔中咱們能夠清楚瞭解到兩種算法之間性能的比較:
http://docs.php.net/manual/zh/features.gc.performance-considerations.php
===================================================================