<?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垃圾回收机制----引用计数基础知识相关推荐

  1. 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )

    文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...

  2. 垃圾回收:引用计数与分代收集机制

    当引⽤计数为0时,该对象⽣命就结束了. 引⽤计数机制的优点: 1.简单 2.实时性:⼀旦没有引⽤,内存就直接释放了.不⽤像其他机制等到特定时机.实时性还带来⼀个好处:处理回收内存的时间分摊到了平时. ...

  3. java垃圾回收 分代_JVM基础知识(四)- 分代回收机制和垃圾回收算法

    这次我们来讲讲垃圾回收,前边或多或少的都提及过垃圾回收的知识点,我们经常说的GC(Garbage Collection)就是垃圾回收,我们都知道JAVA都是由C++演化而来,那么JAVA和C++很重要 ...

  4. php 对象转数组_PHP的垃圾回收机制-PHP高级面试题+详解

    八重樱:面试10家公司,收获9个offer,2020年PHP 面试问题​zhuanlan.zhihu.com ps:本篇内容包括精选面试题与知识篇. PHP面试题关于PHP的垃圾回收机制,PHP的垃圾 ...

  5. PHP的垃圾回收机制-PHP高级面试题+详解

    面试10家公司,收获9个offer,2020年PHP 面试问题​zhuanlan.zhihu.com ps:本篇内容包括精选面试题与知识篇. PHP面试题关于PHP的垃圾回收机制,PHP的垃圾回收机制 ...

  6. python 内存回收机制_Python垃圾回收机制是什么

    不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的双手,找出内存中不用的 ...

  7. 深浅拷贝垃圾回收机制四大高阶函数

    目录: 浅拷贝和深拷贝 垃圾回收机制 高阶函数 浅拷贝和深拷贝 浅拷贝: 不管多么复杂的数据结构,浅拷贝都只会copy一层 深拷贝 : 深拷贝会完全复制原变量相关的所有数据,在内存中生成一套完全一样的 ...

  8. python垃圾回收离职_详细解说python垃圾回收机制

    不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的双手,找出内存中不用的 ...

  9. Android进程优先级和垃圾回收机制

    进程优先级低到高: 空进程 后台进进程 服务进程 可见进程 前台进程 垃圾回收机制: 引用计数法(未采用),无法处理循环引用问题.egA引用B,B引用C,C引用A. 标注并清理回收法(mark and ...

最新文章

  1. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
  2. 七秘诀工作效率与薪水翻番-转
  3. 管理系统中计算机应用知识总结,自考《管理系统中计算机应用》章节知识点复习:管理信息...
  4. ProtoBuffer由.proto文件生成.cc/.h
  5. MySQL存储日志并使用Loganalyzer作为前端展示
  6. mysql当数据改变时_MySQL中,当update修改数据与原数据相同时会再次执行吗?
  7. 从绘画和雕塑中了解板甲的设计思路
  8. MFC中动态获取/设置按钮的文字
  9. 今天会议的召开,和你有关系吗?
  10. java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
  11. 定义Student类,该类中有Sting name和int age两个属性,该类实现Comparable接口,实现根据学生姓名和年龄排序,该类重写toString()输出学生的姓名和年龄。
  12. Irvue for Mac(苹果壁纸软件)
  13. swipe放大效果的焦点图demo
  14. http协议1.x/2.x区别
  15. Codingame - C - OnboardingThe Descent
  16. java基础知识总结,javaweb参考资料大全
  17. 把 VS Code 打造成 Java 开发 IDE,也挺爽!
  18. dockerfile编写之恋爱初体验~~~
  19. 让你的导图不一样的XMind7信息功能卡
  20. Android横竖屏设置

热门文章

  1. AOP方式捕获和处理微信小程序前端全局异常
  2. python去掉列表中的单引号_从Python中的列表中删除单引号
  3. 如何判断自己买的笔记本是否是翻新机
  4. 中国玫瑰精油行业发展现状分析,提取副产物应用广泛「图」
  5. 彻底删除万能恢复大师
  6. Windows给图片打马赛克最简单的方法
  7. 分布式技术点和技术趋势
  8. C++ 如何将数字转换成字符串
  9. limux 卡登录界面_DNF:7.31体验服,第三期“月卡”活动,玩家登录就升级
  10. 天地劫一直说服务器在维护,天地劫幽城再临3月11日登录失败怎么办?3.11服务器连接失败解决方法[多图]...