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 垃圾回收机制----写时复制和引用计数相关推荐

  1. python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...

    引用计数:是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术, 当一个对象的引用被创建或者复制时,对象的引用计数加 1:当一个对象的引用被销毁时,对象的引用计数减 1:当对象的引用计数减少为 ...

  2. php废物,PHP的垃圾回收机制以及大概实现

    垃圾回收,简称gc.顾名思义,就是废物重利用的意思.如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回 ...

  3. Java虚拟机 —— 垃圾回收机制

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

  4. Python 内存管理与垃圾回收机制

    python python内存的泄露和溢出 前言 一.内存泄露和溢出 二.垃圾回收机制 1.引用计数机制 2.标记清除 3.分代回收 三.垃圾回收 总结 前言 虽然在做科研的路上并没有遇到内存方面的问 ...

  5. 【Python知识点梳理】10.Python的垃圾回收机制、代码规范及命令行参数

    Python的垃圾回收机制.代码规范及命令行参数 文章目录 1.Python的垃圾回收机制 2.Python的引用计数机制 3.Python中的循环数据结构及引用计数 4.Python中的GC模块 5 ...

  6. 详谈PHP垃圾回收机制

    引用计数基本知识 每个php变量存在一个叫"zval"的变量容器中.一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息.第一个是"is_ref&quo ...

  7. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

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

  8. 转:java垃圾回收机制最好的解析

    以下转自:https://www.cnblogs.com/likehua/p/4023667.html 很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管 ...

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

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

最新文章

  1. xtrabackup 恢复单个表【转】
  2. 4.1.7 文件共享
  3. CentOS误删除glibc导致系统系统一系列错误的解决办法
  4. 8-13 刷题 复习 知识点集合
  5. 【机器学习】基于LDA主题模型的人脸识别专利分析
  6. 英语四级关于计算机阅读理解,英语四级阅读模拟训练附答案和精讲 第6篇:学习计算机...
  7. 关于python项目路径导入自己写的库出错的一点思考
  8. 基于嵌入式linux的流媒体传输系统
  9. 最简单的WIN7内核PE系统的U盘安装方法+WIN7密码破解
  10. 解决nginx 503 Service Temporarily Unavailable 方法
  11. 游戏服务器经常被DDOS攻击应该怎么办?
  12. 浅谈Linux PMIC驱动(一)
  13. 关于音视频直播技术的总结
  14. 【VINS-Mono】Estimator::initialStructure
  15. 手游《六大门派》 武侠MMORPG手机游戏全套源码下载
  16. python代码优化工具,python - 优化WER(字错误率)代码?
  17. HCNP——OSPF路由器的角色
  18. 关于抢红包的_关于抢红包作文
  19. 一文走遍完整NLP自然语言处理流程
  20. 江苏省地理国情质检处理系统使用说明

热门文章

  1. 计算机辅助教学应用论文,高校计算机辅助教学应用论文
  2. 没有dpkg命令_ffsend:在命令行中通过 FireFox Send 分享文件 | Linux 中国
  3. python装饰器setter实现原理_python装饰器、描述符模拟源码实现
  4. python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例
  5. 学生们喜欢在计算机教室上课用英语怎么说,说说学习本课的感想,并谈谈在信息技术课堂上如何体现以学生为主体,教师为主导?...
  6. android 通知栏按钮,android 通知栏添加按钮点击效果
  7. python在mac上_在Mac上Python多版本切换
  8. 如何用python画一个心形图_求问怎样用python/python turtle画“心”
  9. 柔性机械臂_CSR论文精选 | 基于视觉的双连杆柔性机械臂末端位置跟踪控制
  10. 来来来,送开发板了。