首頁  >  文章  >  後端開發  >  php 垃圾回收機制----寫時複製和引用計數

php 垃圾回收機制----寫時複製和引用計數

WBOY
WBOY原創
2016-08-08 09:25:211088瀏覽

  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教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn