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

时间: 2024-11-10 07:20:07

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

PHP 内存管理 写时复制 垃圾回收

PHP中的变量是不需要手动释放的,内核帮我们实现了变量的内存管理,包括内存的分配和回收 变量深拷贝带来的问题就是效率和内存浪费严重. 解决深拷贝:1.引用计数 2.写时复制 PHP变量的内存管理就是基于这两点实现的 当变量赋值.引用的时候不是进行深拷贝,而是多个变量共用一个value,引用计数来记录这个变量被引用过多少次,当其中的一个变量发生变化时将无法与其他的变量共用 value时,这个时候就需要进行深拷贝进行分离value,这就是写时复制. 引用计数: 用来记录当前有多少个zval指向同一个

掌握PHP垃圾回收机制

php的垃圾回收机制可以简单总结为 引用计数 写时复制 COW机制, 本文主要和大家分享掌握php垃圾回收机制的知识,希望能帮助到大家. 引用计数基本知识 官网的解答如下 每个php变量存在一个叫"zval"的变量容器中一个zval变量容器,除了包含变量的类型和值 ,还包括两个字节的额外信息 is_ref 和 refcount is_ref 是个bool值,用来标识这个变量是否是属于引用集合(reference set).通过这个字节,php引擎才能把普通变量和引用变量区分开来 ref

Java虚拟机垃圾回收机制

在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致OOM. JVM提供了一种垃圾回收机制,简称GC机制.通过GC机制,能够在运行过程中将堆中的垃圾对象不断回收,从而保证程序的正常运行. 垃圾对象的判定 我们都知道,所谓“垃圾”对象,就是指我们在程序的运行过程中不再有用的对象,即不再存活的对象.那么怎么来判断堆中的对象是“垃圾”.不再存活的对象呢?

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

一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了,任何一个拥有public static void main(string[] args)的函数都可以作为实例的运行启点 2.  JVM实例运行 main作为程序初始化线程的起点,任何其他线程由其启动. JVM有两种线程:守护线程和非守护线程.守护线程由JVM使用.main启动后将是非守护线程. 3.

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

1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身.换言之,垃圾回收只会负责释放那些对象占有的内存.对象是个抽象的词,包括引用和其占据的内存空间.当对象没有任何引用时其占据的内存空间随即被收回备用,此时对象也就被销毁.但不能说是回收对象,可以理解为一种文字游戏. 分析: 引用:如果Referen

java 垃圾回收机制

1. java的垃圾回收机制主要工作包括:确定哪些对象属于垃圾,回收无用的对象占用的空间,使堆中的存活对象紧密排列. 2. Java垃圾回收的算法: 引用计数(基本不用): 当引用指向一个对象时,该对象的引用计数器+1: 当引用离开对象挥着被标记为null时,引用计数器-1: 当引用计数器为0时,释放对象占用的空间. 缺陷:如果对象间存在循环引用,可能会发生对象无法被回收的情况. 停止-复制: 对象发现: 从堆栈和静态存储区出发遍历所有引用,找到引用的对象以及该对象包含的所有引用,从而找到所有活

python 垃圾回收机制

Python的GC模块主要运用了"引用计数"(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过"标记-清除"(mark and sweep)解决容器对象可能产生的循环引用的问题.通过"分代回收"(generation collection)以空间换取时间来进一步提高垃圾回收的效率. 一.引用计数 在Python中,大多数对象的生命周期都是通过对象的引用计数来管理的.从广义上来讲,引用计数也是一种垃圾收集机制,

Yaffs2文件系统垃圾回收机制诠释

悲剧,图片贴不出来... 回收顺序: 一)回收最老块(500次回收才进行一次回收) 二)回收最老的脏块(有优先回收的前提下) 三)回收最老的优先回收块(有优先回收的前提下)(这里目前我认为是优先回收且为最老的脏块) 四)回收最脏(脏指在阀值范围内)且最老的块(正常情况下) 五)回收最老的脏块(这种情况是多次找不到回收块,说明当前的系统很干静,可回收的垃圾很少): 思考点: 1.出现ECC纠正的块,是否有必要超过三次进行坏块标记? 2.出现ECC错误的块,是否有必须回收? 3.垃圾回收时是否可以进

14、Java垃圾回收机制

垃圾回收原理和算法 ??Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解.Java程序员可以将更多的精力放到业务逻辑上面,而不是内存管量上面,大大的提高了开发效率.这是因为Java有自动的垃圾回收机制. 内存管理 Java 的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new送键字创建对象即可. 以象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有"不可达"对象的内存空间. 垃圾回收过程 任何一种垃圾回收算法