博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php垃圾回收机制简介
阅读量:6496 次
发布时间:2019-06-24

本文共 2027 字,大约阅读时间需要 6 分钟。

 

 

 

参考 http://php.net/

php zval数据结构

struct _zval_struct {    zvalue_value value;     /* value */    zend_uint refcount__gc;  /* variable ref count */    zend_uchar type;          /* active type */    zend_uchar is_ref__gc;    /* if it is a ref variable */};typedef struct _zval_struct zval; 1.第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。 2.第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。 第一个例子,使用xdebug查看 zval变量容器的内部数据结构。 
a: (refcount=1, is_ref=0)='new string' 第二个例子,
增加一个zval的引用计数,通过赋值观察refcount的变化
<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
a: (refcount=2, is_ref=0)='new string'
第三个例子,减少引用计数来观察zval数据结构内部的变化 
输出
a: (refcount=3, is_ref=0)='new string'a: (refcount=1, is_ref=0)='new string' 复合数据类型
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
输出:
a: (refcount=1, is_ref=0)=array (   'meaning' => (refcount=1, is_ref=0)='life',   'number' => (refcount=1, is_ref=0)=42)

 

接下来是一个很经典的说明zval内部指针关系的例子:

<?php

$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>

输出:

a: (refcount=1, is_ref=0)=array (   'meaning' => (refcount=2, is_ref=0)='life',   'number' => (refcount=1, is_ref=0)=42,   'life' => (refcount=2, is_ref=0)='life') 图:

 

接下来就是一个会在php5.3版本之前导致内存泄漏的一个例子 
输出:
a: (refcount=2, is_ref=1)=array (   0 => (refcount=1, is_ref=0)='one',   1 => (refcount=2, is_ref=1)=...) 上面的输出结果中的"..."说明发生了递归操作, 显然在这种情况下意味着"..."指向原始数组 图:

尽管不再有某个作用域中的任何符号指向这个结构(就是变量容器),由于数组元素“1”仍然指向数组本身,所以这个容器不能被清除 。因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏。

 

php的同步算法处理引用内存泄漏的方法回头再更(暂时没有深入看)

 

回收周期

php会把可能根(疑似垃圾的跟)放在根缓存区里面(默认大小为10000),调用 和 函数来打开和关闭垃圾回收机制。

但是即使关闭了垃圾回收机制,可能根还是会存进根缓存区里面(相比每次检查回收机制是否打开,还不如存进去),但是当缓存区存满之后,如果还有疑似根就不会存进去了,可能造成内存泄漏。

因此 就在你调用函数释放内存之前,先调用函数可能比较明智。因为这将清除已存放在根缓冲区中的所有可能根,然后在垃圾回收机制被关闭时,可留下空缓冲区以有更多空间存储可能根。

垃圾回收会带来时间成本的增加,约百分之10(不到)。但是内存溢出会有明显抑制(特别是在大量多个对象互相指向的时候)

具体参看PHP官网 http://php.net/manual/zh/features.gc.performance-considerations.php

 
 
 

转载于:https://www.cnblogs.com/tobemaster/p/8180091.html

你可能感兴趣的文章
策略模式
查看>>
第二 周作业总结
查看>>
OrderOnline——项目概述
查看>>
POJ-2739(Water)
查看>>
【转】第三节 UNIX文件系统结构
查看>>
为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录
查看>>
Angular7里面实现 debounce search
查看>>
Linux 内核链表
查看>>
git学习------>Git 分支管理最佳实践
查看>>
括号和出栈所有序列问题
查看>>
第一次操刀数据库分表的教训与经验
查看>>
录音声音小
查看>>
Ubuntu 12.04 安装 Chrome浏览器
查看>>
java 反射
查看>>
ORACLE物化视图(物理视图)
查看>>
android 读取json数据(遍历JSONObject和JSONArray)(转)
查看>>
UIScrollView中的手势
查看>>
递归和迭代的差别
查看>>
基于jquery的可拖动div
查看>>
可以简易设置文字内边距的EdgeInsetsLabel
查看>>