php 垃圾回收机制----写时复制和引用计数
PHP使用引用計(jì)數(shù)和寫時(shí)復(fù)制來管理內(nèi)存。寫時(shí)復(fù)制保證了變量間復(fù)制值不浪費(fèi)內(nèi)存,引用計(jì)數(shù)保證了當(dāng)變量不再需要時(shí),將內(nèi)存釋放給操作系統(tǒng)。
要理解PHP內(nèi)存管理,首先要理解一個(gè)概念----符號表。
符號表的概念:
一個(gè)變量有兩部分組成:變量名和變量值。而符號表就是將變量名映射到內(nèi)存中變量值所在地址的數(shù)組。
寫時(shí)復(fù)制:
當(dāng)一個(gè)變量的值復(fù)制到另一個(gè)變量時(shí),PHP沒有為復(fù)制值使用更多的內(nèi)存。相反,他會(huì)跟新符號表來說明這兩個(gè)變量擁有相同的內(nèi)存塊。所以下面的代碼實(shí)際上并沒有創(chuàng)建新數(shù)組:
<?php
$people = array( "Alice","Bob" );
$other ?= $people; //數(shù)組并沒有被復(fù)制
?>
如果修改任何一個(gè)副本,PHP將分配所需的內(nèi)存來進(jìn)行復(fù)制:
$people[ 1 ] = "Tom"; //值改變,數(shù)組被復(fù)制,分配新的內(nèi)存
通過延遲分配和復(fù)制,PHP在很多情形下節(jié)省了時(shí)間和內(nèi)存,這就是寫時(shí)復(fù)制。
引用計(jì)數(shù):
符號表中沒喲個(gè)職都有一個(gè)引用計(jì)數(shù)器,,它的值表示獲取那片內(nèi)存的方式的數(shù)目。
在給$people和$other初始化賦值后,數(shù)組指向符號表,$people和$other引用計(jì)數(shù)器的值為2.換句話說,那一片內(nèi)存有兩種方式可以得到:$people和$other。
但是當(dāng)$people[ 1 ]的只改變之后,PHP為$people創(chuàng)建一個(gè)新的數(shù)組,這時(shí),$people和$other的引用計(jì)數(shù)器的值都為1.當(dāng)一個(gè)變量離開作用域,如函數(shù)參數(shù)和局部變量到達(dá)函數(shù)末尾時(shí),應(yīng)用計(jì)數(shù)器的值減去1.當(dāng)一個(gè)變量在其他內(nèi)存空間被賦值時(shí),舊值得引用計(jì)數(shù)減1。當(dāng)引用計(jì)數(shù)的值為0時(shí),他的內(nèi)存被釋放。
這就是引用計(jì)數(shù)。
引用計(jì)數(shù)是首選的內(nèi)存管理方式。保持變量作用域限制于函數(shù)中,通過值來傳遞,并讓引用計(jì)數(shù)負(fù)責(zé)內(nèi)存管理。如果你想主動(dòng)獲得更多的信息或者控制權(quán)來釋放一個(gè)變量的值,可以使用isset()和unset()函數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/phpcoder/p/4462210.html
總結(jié)
以上是生活随笔為你收集整理的php 垃圾回收机制----写时复制和引用计数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse弃坑记第一篇之在idea上
- 下一篇: 动态规划算法php,php算法学习之动态