天天看點

php中的垃圾收集

關鍵字: 垃圾收集

PHP用引用計算和寫時複制 (copy-on-write)來管理記憶體。寫時複制確定在變量之間複制值時不浪費記憶體,引用計算確定在引用不再需要時将記憶體傳回給作業系統。

       要了解PHP中的記憶體管理,必須首先了解符号表(symbol table)的思想,變量有兩部分--變量名(如$name)和變量值(如"Fred")。符号表是一個數組,此數組将變量名映射到其值在記憶體中的位置。

       當從一個變量複制值到另一個變量是,PHP沒有因為複制值而得到更多的記憶體,而是更新符号表,以表明“這兩個變量是同一塊記憶體的名字”。是以下面的代碼實際上并沒有建立一個新數組:

PHP代碼

  1. $worker = array ( "Fred" ,35, "Wilma" );   
  2. $other = $worker ;        //數組沒有被複制   

       如果修改任意一個拷貝,那麼PHP将配置設定記憶體并産生該拷貝:

PHP代碼

  1. $worker [1] = 36;     //數組被複制,值發生變化   

       由于延遲配置設定和複制,PHP在很多情況下節省了時間和記憶體。這就是寫時複制。

       符号表指向的每個值都有一個引用計數(reference count),它是一個數字,表示通向那片記憶體的途徑數。在将數組的初值賦給$worker和将$worker賦給$other後,符号表中指向數組的條目為$worker和$other,引用計數為2。換句話說,有兩條途徑可以到達那片記憶體:通過$worker或$other。但$worker[1]改變以後,PHP為$worker建立一個新數組,并且每一個數組的引用計數都僅僅為1 。

       當一個變量不在作用域中(函數參數或局部變量在函數的結尾)時,引用計數值減1 。當一個變量被配置設定的值在記憶體的其他區域時,舊的引用計數值減1 。當引用計數值達到0時,記憶體被釋放。這就是引用計數。

       引用計數式管理記憶體的首選方法 ,保持變量的函數局部性傳遞函數需要用到的值,并且讓引用計數負責在引用不再需要時釋放記憶體。如果想要獲得更多資訊或完全控制釋放變量的值,可以用函數isset()和unset()。

       檢視變量是否已經設定(即使是空字元串),用isset():

PHP代碼

  1. $s1 = isset( $name );   //$s1為false   
  2. $name = "Fred" ;   
  3. $s2 = isset( $name );   //$s2為true   

       用unset()來删除一個變量的值:

PHP代碼

  1. $name = "Fred" ;   
  2. unset( $name );                //$name為NULL

轉自:http://zhengdl126.javaeye.com/blog/430989