php 垃圾回收机制----写时复制和引用计数
PHP使用引用計數和寫時復制來管理內存。寫時復制保證了變量間復制值不浪費內存,引用計數保證了當變量不再需要時,將內存釋放給操作系統。
要理解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()函數。
轉載于:https://www.cnblogs.com/phpcoder/p/4462210.html
總結
以上是生活随笔為你收集整理的php 垃圾回收机制----写时复制和引用计数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse弃坑记第一篇之在idea上
- 下一篇: 郊野