PHP垃圾回收机制----引用计数基础知识
<?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垃圾回收机制----引用计数基础知识相关推荐
- 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )
文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...
- 垃圾回收:引用计数与分代收集机制
当引⽤计数为0时,该对象⽣命就结束了. 引⽤计数机制的优点: 1.简单 2.实时性:⼀旦没有引⽤,内存就直接释放了.不⽤像其他机制等到特定时机.实时性还带来⼀个好处:处理回收内存的时间分摊到了平时. ...
- java垃圾回收 分代_JVM基础知识(四)- 分代回收机制和垃圾回收算法
这次我们来讲讲垃圾回收,前边或多或少的都提及过垃圾回收的知识点,我们经常说的GC(Garbage Collection)就是垃圾回收,我们都知道JAVA都是由C++演化而来,那么JAVA和C++很重要 ...
- php 对象转数组_PHP的垃圾回收机制-PHP高级面试题+详解
八重樱:面试10家公司,收获9个offer,2020年PHP 面试问题zhuanlan.zhihu.com ps:本篇内容包括精选面试题与知识篇. PHP面试题关于PHP的垃圾回收机制,PHP的垃圾 ...
- PHP的垃圾回收机制-PHP高级面试题+详解
面试10家公司,收获9个offer,2020年PHP 面试问题zhuanlan.zhihu.com ps:本篇内容包括精选面试题与知识篇. PHP面试题关于PHP的垃圾回收机制,PHP的垃圾回收机制 ...
- python 内存回收机制_Python垃圾回收机制是什么
不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的双手,找出内存中不用的 ...
- 深浅拷贝垃圾回收机制四大高阶函数
目录: 浅拷贝和深拷贝 垃圾回收机制 高阶函数 浅拷贝和深拷贝 浅拷贝: 不管多么复杂的数据结构,浅拷贝都只会copy一层 深拷贝 : 深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的 ...
- python垃圾回收离职_详细解说python垃圾回收机制
不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的双手,找出内存中不用的 ...
- Android进程优先级和垃圾回收机制
进程优先级低到高: 空进程 后台进进程 服务进程 可见进程 前台进程 垃圾回收机制: 引用计数法(未采用),无法处理循环引用问题.egA引用B,B引用C,C引用A. 标注并清理回收法(mark and ...
最新文章
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
- 七秘诀工作效率与薪水翻番-转
- 管理系统中计算机应用知识总结,自考《管理系统中计算机应用》章节知识点复习:管理信息...
- ProtoBuffer由.proto文件生成.cc/.h
- MySQL存储日志并使用Loganalyzer作为前端展示
- mysql当数据改变时_MySQL中,当update修改数据与原数据相同时会再次执行吗?
- 从绘画和雕塑中了解板甲的设计思路
- MFC中动态获取/设置按钮的文字
- 今天会议的召开,和你有关系吗?
- java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
- 定义Student类,该类中有Sting name和int age两个属性,该类实现Comparable接口,实现根据学生姓名和年龄排序,该类重写toString()输出学生的姓名和年龄。
- Irvue for Mac(苹果壁纸软件)
- swipe放大效果的焦点图demo
- http协议1.x/2.x区别
- Codingame - C - OnboardingThe Descent
- java基础知识总结,javaweb参考资料大全
- 把 VS Code 打造成 Java 开发 IDE,也挺爽!
- dockerfile编写之恋爱初体验~~~
- 让你的导图不一样的XMind7信息功能卡
- Android横竖屏设置
热门文章
- AOP方式捕获和处理微信小程序前端全局异常
- python去掉列表中的单引号_从Python中的列表中删除单引号
- 如何判断自己买的笔记本是否是翻新机
- 中国玫瑰精油行业发展现状分析,提取副产物应用广泛「图」
- 彻底删除万能恢复大师
- Windows给图片打马赛克最简单的方法
- 分布式技术点和技术趋势
- C++ 如何将数字转换成字符串
- limux 卡登录界面_DNF:7.31体验服,第三期“月卡”活动,玩家登录就升级
- 天地劫一直说服务器在维护,天地劫幽城再临3月11日登录失败怎么办?3.11服务器连接失败解决方法[多图]...