PHP内存管理机制与垃圾回收机制

PHP内存管理机制

1 var_dump(memory_get_usage());   //获取内存
2 $a = "laruence";                //定义一个变量
3 var_dump(memory_get_usage());   //定义变量之后获取内存
4 unset($a);                      //删除该变量
5 var_dump(memory_get_usage());   //删除变量后获取内存
6  

从上面可以看出php的内存管理机制是:预先给出一块空间,用来存储变量,当空间不够时,再申请一块新的空间。

1.存储变量名,存在符号表。

2.变量值存储在内存空间。

3.在删除变量的时候,会将变量值存储的空间释放,而变量名所在的符号表不会减小。

var_dump(memory_get_usage());  //获取内存
//定义100个变量
for($i=0;$i<100;$i++)
{
    $a = "test".$i;
    $$a = "hello";
}
//获取定义100个变量之后的内存
var_dump(memory_get_usage());
//定义100个变量并删除
for($i=0;$i<100;$i++)
{
    $a = "test".$i;
    unset($$a);
}
//获取删除之后的内存
var_dump(memory_get_usage());

从上面可以看出,虽然删除后内存变小了,但还是比没定义变量之前时大,这是因为虽然删除了变量的值,但变量名没有被删除。

php垃圾回收机制

PHP变量存储是存储在一个zval容器里面的

1.类型 2.值 3.is_ref 代表是否有地址引用 4.refcount 指向该值的变量数量

1.变量赋值的时候:is_ref为false  refcount为1

$a = 1;
xdebug_debug_zval(‘a‘);
echo PHP_EOL;

2.将变量a的值赋给变量b,变量b不会立刻去在内存中存储值,而是先指向变量a的值,一直到变量a有任何操作的时候

$b = $a;
xdebug_debug_zval(‘a‘);
echo PHP_EOL;

3.因为程序又操作了变量a,所以变量b会自己申请一块内存将值放进去。所以变量a的zavl容器中refcount会减1变为1,变量c指向a,所以refcount会加1变为2

$c = &$a;
xdebug_debug_zval(‘a‘);
echo PHP_EOL;
xdebug_debug_zval(‘b‘);
echo PHP_EOL;

垃圾回收:

1.在5.2版本或之前版本,PHP会根据refcount值来判断是不是垃圾

如果refcount值为0,PHP会当做垃圾释放掉

这种回收机制有缺陷,对于环状引用的变量无法回收

2.在5.3之后版本改进了垃圾回收机制

如果发现一个zval容器中的refcount在增加,说明不是垃圾

如果发现一个zval容器中的refcount在减少,如果减到了0,直接当做垃圾回收

如果发现一个zval容器中的refcount在减少,并没有减到0,PHP会把该值放到缓冲区,当做有可能是垃圾的怀疑对象。

当缓冲区达到了临界值,PHP会自动调用一个方法去遍历每一个值,如果发现是垃圾就清理

时间: 2024-10-16 13:51:19

PHP内存管理机制与垃圾回收机制的相关文章

JVM内存管理和JVM垃圾回收机制

JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制. AD: 你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示. JVM学习笔记 JVM内存管理和JVM垃圾回收 JVM内存组成结构 JVM内存

JVM内存管理机制和垃圾回收机制

JVM自身结构物理图: Java代码编译和执行的整个过程包含了以下三个重要的机制: 1.java源码编译机制 1)分析和输入到符号表 class文件结构包含: 结构信息.包括class文件格式版本号及各部分的数量与大小的信息 元数据.对应于Java源码中声明与常量的信息.包含类/继承的超类/实现的接口的声明信息.域与方法声明信息和常量池 方法信息.对应Java源码中语句和表达式对应的信息.包含字节码.异常处理器表.求值栈与局部变量区大小.求值栈的类型记录.调试符号信息 2.类加载机制 1)Boo

JVM的内存区域划分以及垃圾回收机制详解

在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以及ARC(自动引用计数)的内存管理方式,下方会对其进行回顾.而目前的JVM的内存回收机制则不是使用的引用计数,而是主要使用的"复制式回收"和"自适应回收". 当然除了上面是这两种算法外,还有其他是算法,下方也将会对其进行介绍.本篇博客,我们先简单聊一下JVM的区域划分,

内存缓存机制and垃圾回收机制

一.内存缓存机制 var_dump(memory_get_usage(true)); $a="laruence"; var_dump(memory_get_usage(true)); unset($a); var_dump(memory_get_usage(true)); 1.加上true之后,显示的三个相等的数代表php申请的内存大小,无论你是空着还是向里面存数据,都显示php申请的内存,当你存储的数据过大时,php会再申请一块新的内存进行扩充,这样就避免了php经常性的调用内存.

Java深度历险(四)——Java垃圾回收机制与引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存

java 垃圾回收机制 引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存

内存泄漏与垃圾回收机制

内存泄漏与垃圾回收机制 什么是内存泄漏? 程序的运行需要内存,只要程序提出要求,操作系统或者运行是就必须供给内存.对于持续运行的服务进程,必须及时释放内存,否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃.不再用到的内存,没有及时释放,就叫做内存泄漏. 有些语言(比如c语言)必须手动释放内存,程序员负责内存管理.这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制". javascript垃圾回收机制原理: 解决内存的泄露,垃圾回收机制会定期(周

JS高程中的垃圾回收机制与常见内存泄露的解决方法

起因是因为想了解闭包的内存泄露机制,然后想起<js高级程序设计>中有关于垃圾回收机制的解析,之前没有很懂,过一年回头再看就懂了,写篇博客与大家分享一下. #内存的生命周期: 分配你所需要的内存: 由于字符串.对象等没有固定的大小,js程序在每次创建字符串.对象的时候,程序都会分配内存来存储那个实体. 使用分配到的内存做点什么. 不需要时将其释放回归: 在不需要字符串.对象的时候,需要释放其所占用的内存,否则将会消耗完系统中所有可用的内存,造成系统崩溃,这就是垃圾回收机制所存在的意义. 所谓的内

JavaScript中的垃圾回收机制与内存泄露

什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他们不会再被用到,但是还没有及时释放,这就叫做内存泄露(memory leak).如果出现了内存泄露,那么有可能 C语言是通过手动分配和释放内存的, 如通过malloc分配,通过free释放,这种方式是比较麻烦的.而java.c#.js等是为了解放程序员的负担,提出了程序自动释放内存,这种方式就是垃圾