Home >Backend Development >PHP Tutorial >php 垃圾回收机制-写时复制跟引用计数

php 垃圾回收机制-写时复制跟引用计数

WBOY
WBOYOriginal
2016-06-13 12:18:43744browse

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()函数。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn