韩漫免费漫画在线观看方法,《好好疼爱里面》免费看,年轻漂亮的女士护士内衣,妈妈醉酒后把我当爸爸电视剧

文章 > PHP教程 > php引用计数如何实现垃圾回收

php引用计数如何实现垃圾回收

php引用计数 垃圾回收

头像

小妮浅浅

2021-08-17 10:02:335011浏览 · 0收藏 · 0评论

实现说明

1、给对象添加引用计数器,每次在某个地方引用计数器的值都会增加。每当引用失效时,计数器的值就会减一。

变量value的refcount减一后等于0的话,这个value就会被释放,不是垃圾。垃圾回收器不处理。

变量value的refcount减一后大于0以上的话,这个value被认为不能释放,有可能成为垃圾。

2、垃圾回收器收集可能的垃圾,达到一定数量后启动垃圾鉴定程序,释放真正的垃圾。

实例

<?php
// PHP垃圾回收机制案例: 参考php手册
 
 
// --------------------标量类型--------------------
// tip:每个php变量存在一个叫"zval"的变量容器中,该容器中包含变量的类型和值,"is_ref":是否是引用变量,"refcount":引用计数
 
// ex:生成一个新的 zval容器
$a = 'new string';
// ex:显示 zval容器 信息
xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0),string 'new string' (length=10)
 
// ex:增加 zval容器的引用计数
$c = $b = $a;
xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'new string' (length=10)
 
 
xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'new string' (length=10)
xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'new string' (length=10)
// tip:此时只有一个容器, 因为当没必要时,php不会去复制已生成的变量容器
// 此时这个变量容器被变量 a ,变量 b和变量c关联.
 
 
unset($b); // ex:减少引用计数
xdebug_debug_zval('a'); // a:(refcount=2, is_ref=0),string 'new string' (length=10)
// tip:unset 删除变量时,refcount 变量计数减一,此时只有$a,$b 指向该变量容器
 
 
unset($a);
unset($c);
var_dump($a);
// tip:此时 recount为 0,变量被删除
// 当recount 变为 0 时,包含类型和值的这个变量容器就会从内存中删除。
 
 
// --------------------复合类型--------------
echo '--------------复合类型------------<br/>';
 
$a = array(
    'name' => 'junior',
    'age'  => 18
);
xdebug_debug_zval('a');
// a:(refcount=1, is_ref=0),
// array (size=2)
//   'name' => (refcount=1, is_ref=0),string 'junior' (length=6)
//   'age' => (refcount=1, is_ref=0),int 18
 
 
// ex:添加一个已经存在的元素到数组中
$a['love'] =  $a['name'];
xdebug_debug_zval('a');
// a:(refcount=1, is_ref=0),
// array (size=3)
//   'name' => (refcount=2, is_ref=0),string 'junior' (length=6)
//   'age' => (refcount=1, is_ref=0),int 18
//   'love' => (refcount=2, is_ref=0),string 'junior' (length=6)
 
 
// $a = array('one');
// xdebug_debug_zval('a');
// // $b = &$a;
// $c = $a;
// $b = &$c;
 
// xdebug_debug_zval('b');
// xdebug_debug_zval('c');
// xdebug_debug_zval('a');
 
 
 
// 清理变量容器问题
echo '------------内存泄漏问题-----------<br/>';
$a = array('one');
xdebug_debug_zval('a');
// a:(refcount=1, is_ref=0),
// array (size=1)
//   0 => (refcount=1, is_ref=0),string 'one' (length=3)
 
$a[] = &$a;
xdebug_debug_zval('a');
// a:(refcount=2, is_ref=1),
// array (size=2)
//   0 => (refcount=1, is_ref=0),string 'one' (length=3)
//   1 => (refcount=2, is_ref=1),
//     &array
 
// unset($a);
// (refcount=1, is_ref=1)=array (
//     0 => (refcount=1, is_ref=0)='one',
//     1 => (refcount=1, is_ref=1)=...
//  )
 
// tip: unset($a) 后引用计数减一,尽管不再有某个作用域中的任何符号指向这个结构(就是变量容器),
// 由于数组元素"1"仍然指向数组本身,所以这个容器不能被清除
// 因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏
// 庆幸的是, php将在脚本执行结束时清除这个数据结构, 但是在php清除之前,将耗费不少内存.
// 同样的情况也会发生在对象上,实际上对象更有可能出现这种情况,因为对象总是隐式的被引用。

以上就是php引用计数实现垃圾回收的方法,希望对大家有所帮助。更多php学习指路:php教程

推荐操作系统:windows7系统、PHP5.6、DELL G3电脑

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

男人晚上吃奶时乳房会变| 《疯狂72小时》韩剧| 《温柔善良的儿媳妇》的背景故事 | 《吃入铃铛》双男主全文免费阅读| 7777777亚洲和欧洲尺码表| 韩剧《喂奶2》的主要内容是什么| 腿张开我要添到你高潮H漫画软件| 《警花交换做爰》| 妈妈我要亲亲你PPT| 蜜桃成熟时33D| 我的善良的好朋友| 大度亲吻原声视频| 国产暴力强伦轩| 法国空乘伦理2| 《交换做爰》在线观看| 少妇高潮喷水久久久久久久久| 孤男寡女免费观看高清电视剧狂飙 | 老妇人50-60-70-80| 《完美邻居2》电影在线观看| 肉多荤文高H羞耻玩弄校园| 校长日少女林雅白最新章节更新小..| 第一次和公翁做爰又大又粗| 人狗大战5高清正版免费观看| 《高压监狱5》完整版| 天堂草在线观看国产AV| 小静被门卫大爷灌满川NG液视.. | 《医务室上垒》动漫全集在线观看 | 欲奴性猛交2无删减| 俄罗斯姑娘免费看高清电视剧| 亲爱的爸爸【父女】笔趣阁负责的| 麻花星空天美MV免费观看电视剧| 成色P31S是国精产品吗| 放荡少妇出轨小说| 强伦女教师2:伦理| 打开B站看片| 意大利《医务室绣感》| 交换的日子| 泰剧《劈开你的腿》免费观看| 少妇高潮免费观看A片| 《喂奶人妻厨房HD》| 美国禁忌2在线观看电视剧