程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 理解PHP引用計數和寫時復制

理解PHP引用計數和寫時復制

編輯:關於PHP編程

php使用引用計數和寫時復制(copy-on-write)來管理內存。引用計算確保在引用不再需要時將內存返回給操作系統,寫時復制確保在變量之間復制值時不浪費內存。

要理解PHP中的內存管理,必須首先理解符號表(symbol table)的思想,變量有兩部分–變量名(如$name)和變量值(如”Fred”)。符號表是一個數組,此數組將變量名映射到其值在內存中的位置。

當從一個變量復制值到另一個變量是,PHP沒有因為復制值而得到更多的內存,而是更新符號表,以表明“這兩個變量是同一塊內存的名字”。所以下面的代碼實際上並沒有創建一個新數組:

$people = array("Gonn",25,"Zeng");
$programmer = $people; //數組沒有被復制

如果修改任意一個拷貝,那麼PHP將分配內存並產生該拷貝:

$people[1] = 26; //數組被復制,值發生變化

由於延遲分配和復制,PHP在很多情況下節省了時間和內存。這就是寫時復制。

符號表指向的每個值都有一個引用計數(reference count),它是一個數字,表示通向那片內存的途徑數。在將數組的初值賦給$people和將$people賦給$programmer後,符號表中指向數組的條目為$people和$programmer,引用計數為2。換句話說,有兩條途徑可以到達那片內存:通過$people或$programmer。但$people[1]改變以後,PHP為$people創建一個新數組,並且每一個數組的引用計數都僅僅為1。

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

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

查看變量是否已經設置(即使是空字符串),用isset():

$s1 = isset($name); //$s1為false
$name = "Gonn";
$s2 = isset($name); //$s2為true

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

$name = "Gonn";
unset($name); //$name為NULL

延伸閱讀:http://php.net/manual/zh/features.gc.refcounting-basics.php

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved