PHP使用引用計數和寫入時複製來管理記憶體。寫入時複製保證了變數間複製值不浪費內存,引用計數保證了當變數不再需要時,將內存釋放給作業系統。
要理解PHP記憶體管理,首先要理解一個概念----符號表。
符號表的概念:
一個變數有兩個部分組成:變數名稱和變數值。而符號表就是將變數名稱對應到記憶體中變數值所在位址的陣列。
寫時複製:
當一個變數的值複製到另一個變數時,PHP並沒有為複製值使用更多的記憶體。相反,他會跟新符號表來說明這兩個變數擁有相同的記憶體區塊。所以下面的程式碼其實並沒有創建新數組:
$people = array( "Alice","Bob" );
$other = $people; //陣列並沒有被複製
?>
如果修改任何一個副本,PHP將分配所需的記憶體來進行複製:
$people[ 1 ] = "Tom"; //值改變,陣列被複製,分配新的記憶體
透過延遲分配和複製,PHP在許多情況下節省了時間和內存,這就是寫時複製。
引用計數:
符號表中沒喲個職都有一個引用計數器,,它的值表示獲取那片內存的方式的數目。
在給$people和$other初始化賦值後,數組指向符號表,$people和$other引用計數器的值為2.換句話說,那一片記憶體有兩種方式可以得到:$people和$other。
但是當$people[ 1 ]的只改變之後,PHP為$people創建一個新的數組,這時,$people和$other的引用計數器的值都為1.當一個變數離開作用域,如函數參數和局部變數到達函數末端時,應用計數器的值減去1.當一個變數在其他記憶體空間被賦值時,舊值得引用計數減1。當引用計數的值為0時,他的記憶體被釋放。
這就是引用計數。
引用計數是首選的記憶體管理方式。保持變數作用域限制於函數中,透過值來傳遞,並讓引用計數負責記憶體管理。如果你想主動獲得更多的資訊或控制權來釋放一個變數的值,可以使用isset()和unset()函數。
以上就介紹了php 垃圾回收機制----寫時複製和引用計數,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。