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

php 垃圾回收机制----写时复制和引用计数的更多相关文章

  1. phpCOW机制(写时复制)

    写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改. COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C ...

  2. 掌握PHP垃圾回收机制

    php的垃圾回收机制可以简单总结为 引用计数 写时复制 COW机制, 本文主要和大家分享掌握php垃圾回收机制的知识,希望能帮助到大家. 引用计数基本知识 官网的解答如下 每个php变量存在一个叫”z ...

  3. PHP的垃圾回收机制以及大概实现

    垃圾回收,简称gc.顾名思义,就是废物重利用的意思.再说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完之后不收拾,那么这块地就算糟蹋了,地越用越少,最后一地全是屎.说到底一句, ...

  4. Java虚拟机垃圾回收机制

    在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致 ...

  5. 编程语言和python介绍, 变量,小整数池,垃圾回收机制

    1.编程语言的发展史 计算机是基于电工作(基于高.低电平)1010010101011 1.机器语言 优点:执行速度够快 缺点:开发效率非常低 2.汇编语言(通过英文字符组成) 优点:执行效率相较于机器 ...

  6. JVM的生命周期、体系结构、内存管理和垃圾回收机制

    一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...

  7. 浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

  8. PHP垃圾回收机制

    一.引用计数基本知识 每个php变量存在一个叫"zval"的变量容器中,当一个变量被赋常量值时,就会生成一个zval变量容器.一个zval变量容器,除了包含变量的类型和值,还包括两 ...

  9. 了解 ptyhon垃圾回收机制

    Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...

随机推荐

  1. hdu2317Nasty Hacks

    Problem Description You are the CEO of Nasty Hacks Inc., a company that creates small pieces of mali ...

  2. Gengxin讲STL系列——String

    衔接上一篇引导. 作为第一篇博客,就要大气一点. 可我好像并不知道怎么才能让自己的博客大气一点= =: 明天是我生日,自己先买个中文域名庆祝了一下…… 好了,废话说完了,结果博客也没大气到哪去……,正 ...

  3. CentOS minimal版安装图形界面的步骤(自动获取IP)

    1.连接网络: CentOS minimal.iso安装好后,进入终端,默认是不开网络的, 首先启用网卡, 自动获取ip. ifconfig eth0 up   www.2cto.com  dhcli ...

  4. python核心编程-第五章-习题

    1.长整型表示数的范围比整型更大.在python中,整型.长整型趋于统一,普通用户不用特别关注两者区别,仅当需引用C语言时需要特别注意. 2.操作符 (a) def product(x,y): ret ...

  5. Lake Counting--poj2386

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23950   Accepted: 12099 D ...

  6. 钱币兑换问题(hd1284)

    钱币兑换问题 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于32768.   Output 对应每个输 ...

  7. 今年暑假不AC(贪心)

    今年暑假不AC 点我 Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” 确实如此,世界杯来了,球迷的节日 ...

  8. 字符排序(hdoj1106)

    Problem Description 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整 ...

  9. javascript 事件设计模式

    http://plkong.iteye.com/blog/213543 1. 事件设计概述 事件机制可以是程序逻辑更加清晰可见,在JavaScript中很多对象都有自己的事件,如:button有onc ...

  10. 厂商自定义USB设备类概述

    USB协会将常用具有相同/相似功能的设备归为一类,并制定了相关的设备类规范,这样就能保障只要依照同样的规范标准,即使不同的厂商开发的USB设备也可以使用同样的驱动程序,而且操作系统中无须为每种设备提供 ...