PHP垃圾回收机制

PHP垃圾回收机制是php5之后才有的这个东西,下面我来给大家介绍一下关于PHP垃圾回收机制一些理解,希望对各位同学有所帮助。

php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器 1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。

“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;

php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

该算法可以参考下面这篇文章,这是这篇小总结的主要参考文献:) :浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

看下面的例子

Example 1: gc.php

 代码如下 复制代码

<?php 
error_reporting(E_ALL); 
$a = 'I am test.'; 
$b = & $a;

echo $b ."n"; 
?>

不用说 % php -f gc.php 输出结果非常明了:
hy0kl% php -f gc.php 
I am test.

好,下一个:
Example 2:

 代码如下 复制代码

<?php 
error_reporting(E_ALL); 
$a = 'I am test.'; 
$b = & $a;

$b = 'I will change?';                                                         

echo $a ."n"; 
echo $b ."n"; 
?>
执行结果依然很明显:
hy0kl% php -f gc.php 
I will change?
I will change?

君请看:
Example 3:

 代码如下 复制代码

<?php 
error_reporting(E_ALL); 
$a = 'I am test.'; 
$b = & $a; 

unset($a);

echo $a ."n"; 
echo $b ."n";
?>
是不是得想一下下呢?
hy0kl% php -f gc.php 
Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 8
I am test.

有点犯迷糊了吗?

君再看:
Example 4:

 代码如下 复制代码

<?php 
error_reporting(E_ALL); 
$a = 'I am test.'; 
$b = & $a;

unset($b);                                                                     

echo $a ."n"; 
echo $b ."n";
?>

其实如果 Example 3 理解了,这个与之异曲同工.
hy0kl% php -f gc.php 
I am test.
Notice: Undefined variable: b in /usr/local/www/apache22/data/test/gc.php on line 9

君且看:
Example 5:

 代码如下 复制代码

<?php 
error_reporting(E_ALL); 
$a = 'I am test.'; 
$b = & $a;

$a = null;

echo '$a = '. $a ."n"; 
echo

'$b = '. $b ."n"; 
?>
猛的第一感觉是什么样的?
hy0kl% php -f gc.php 
$a = 
$b =
没错,这就是输出结果,对 PHP GC 已有深入理解的 phper 不会觉得有什么奇怪,说实话,当我第一次运行这段代码时很意外,却让我对 PHP GC 有更深刻的理解了.那么下面与之同工的例子自然好理解了.

Example 6:

 代码如下 复制代码

<?php                                                                         
error_reporting(E_ALL); 
$a = 'I am test.'; 
$b = & $a;

$b = null;

echo '$a = '. $a ."n"; 
echo '$b = '. $b ."n"; 
?>

这是一篇的php教程了,大家还可以百度去了解更多关于PHP垃圾回收机制文章哦,这里就不一一介绍了。

时间: 2024-08-03 22:24:03

PHP垃圾回收机制的相关文章

析JAVA之垃圾回收机制

本文为2010年编写,所以有很多看法不是很准确,有一定的参考价值,如需要更加深入细节,请参看,2012年编写的关于JVM的文章: 认识JVM--第一篇-对象生成&回收算法 认识JVM--第二篇-java对象内存模型 JVM第三篇(简单demo) 系统架构-性能篇章1(应用系统性能2-OOM&参数配置) 相继的还会有更多的java深入的知识和机制. 对于JAVA编程和很多类似C.C++语言有一个巨大区别就是内存不需要自己去free或者delete,而是由JVM垃圾回收机制去完成的.对于这个过

【转载】关于垃圾回收机制

转载自[雨声论坛]原作:software_young ----------------------转载开始------------------------所谓垃圾回收机制,指的是内存和各种变量或者目标所使用内存的释放和回收机制. 软件的发展历史,就是软件不断庞大.人力逐渐难以控制和对开发人员的技术要求逐渐降低的历史. 早先的许多软件,都是用汇编语言写的,汇编是机器码的助记符方式,因此,用汇编编程,实际就是用机器码编程.它要求程序员对机器非常熟悉才行,否则很难编出能用的程序. 那时候的程序员首先要

Java的垃圾回收机制研究

一.谁在做Garbage Collection? 一种流行的说法:在C++里,是系统在做垃圾回收;而在Java里,是Java自身在做. 在C++里,释放内存是手动处理的,要用delete运算符来释放分配的内存.这是流行的说法.确切地说,是应用认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了.这个要求,对编码者来说,是件很麻烦.很难做到的事.随便上哪个BBS,在C/C++版块里总是有一大堆关于内存泄漏的话题. Java采用一种不同的,很方便的方法:Garbage Collecti

简单讲解Lua中的垃圾回收机制

  这篇文章主要介绍了Lua中的垃圾回收机制,自动的垃圾回收是Lua的重要特性之一,需要的朋友可以参考下 Lua使用基于被内置在Lua某些算法的垃圾收集自动内存管理.可以自动内存管理的结果,作为一个开发者: 没有必要担心的对象分配内存. 无需释放他们时,不再需要可将其设置为nil. Lua使用运行不时收集死的对象时,不再从Lua程序中访问垃圾收集器. 所有对象,包括表,用户数据,函数,线程,字符串等受自动内存管理. Lua使用增量标记和使用两个数字来控制其垃圾回收周期即垃圾收集暂停和垃圾收集器的

垃圾回收机制与引用类型

 Java语言的一个重要特性是引入了自动的内存管理机制,这样一来,开发人员就不需要自己来管理应用中的内存了.C/C++开发人员需要通过malloc/free和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,因为这些方法使用不当很容易造成内存访问错误和内存泄露等严重问题.一个最常见的问题是 "悬挂引用(dangling references)",即一个引用或指针所指向的内存区块已经被错误的回收并重新分配给新的对象了,如果程序继续使用这个引用或指针的话会,

收集器-java垃圾回收机制怎么回收变量

问题描述 java垃圾回收机制怎么回收变量 如下: 1.Object aobj=new Object() 2.Object bobj = new Object() 3. Object cobj = new Object() 4.aobj = bobj; 5.aobj = cobj; 6.cobj = null; 7.aobj = null; 那么第几行的obj符合垃圾收集器的收集标准. A:1 B:2 C:3 D:4 E:5 F:6 G:7 垃圾收集器的收集标准是什么? 是不是不引用了就可以收集

.Net 垃圾回收机制原理(一)

英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.cnblogs.com/yukaizhao/archive/2011/11/23/dot_net_GC_1.html 有了Microsoft.Net clr中的垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的.尽管如此,作为一个.Net程序员很有必要理解垃圾回收是如何工作的.这篇文章我们就来看下.Net是如何分配和管理托管内存的,之后再一步一步描述垃圾回收器工作

[JVM]成为JavaGC专家(1)—深入浅出Java垃圾回收机制

对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者.如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开发经验.如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点.当然,我们不能以偏概全,这不能作为评价一个好的开发人员的共通标准.但是,我要说的是,深入理解GC是成为一名伟

java垃圾回收机制-java堆中方法区中的内容会被删除么

问题描述 java堆中方法区中的内容会被删除么 java有垃圾回收机制,会自动回收不使用的对象,问题一:那在堆中的方法区中存储的关于类的代码以及常量池等这些信息会, 在不使用这个类以后,这些信息是会被销毁么?怎样被销毁呢?是由GC回收么?问题二:栈中自动分配的存储的对象引用会被自动销毁么?代码运行之后销毁么? 解决方案 堆上没有什么方法区.代码放在代码区,函数的局部变量放在堆栈上.栈中自动分配的存储的对象引用会被自动销毁么,是的,在函数返回的时候销毁.

Python垃圾回收机制总结

Python 垃圾回收机制 内存管理 Python中的内存管理机制的层次结构提供了4层,其中最底层则是C运行的malloc和free接口,往上的三层才是由Python实现并且维护的,第一层则是在第0层的基础之上对其提供的接口进行了统一的封装,因为每个系统都可能差异性.   内存池 Python为了避免频繁的申请和删除内存所造成系统切换于用户态和核心态的性能问题,从而引入了内存池机制,专门用来管理小内存的申请和释放.内存池分为四层:block.pool.arena和内存池.如下图: block:有