<?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. OAM Kubernetes 标准实现与核心依赖库发布 | 云原生生态周报 Vol. 52
  2. pe如何自动加载外置工具_如何自动加载网站的深色模式?
  3. Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?
  4. python import 路径_Python 从相对路径下import的方法
  5. Ubuntu开启SSHD服务
  6. MATLAB 三路频分复用通信系统
  7. 现在的钱真的那么容易挣了吗?
  8. c++ gdb 绑定源码_gdb调试g++ -g生成文件,list后不能看到源代码
  9. 【LeetCode】【数组】题号:485,最大连续1的个数
  10. 闭包基础概念,闭包详解
  11. 寻找代理服务器的常用软件
  12. 【笔记篇】01初识供应链——之《实战供应链》
  13. linux centos 架构,CentOS Linux 7.5 (build 1804) 现可用于IBM POWER9体系架构
  14. linux tcp调优
  15. 《七哥说道》第八章:约在410,北漂可还行?
  16. 苏格拉底、柏拉图、亚里士多德,走进希腊三贤的世界
  17. 英语专家谈英语学习方法
  18. 利用CSS设置文字的阴影效果
  19. R语言工具变量与两阶段最小二乘法
  20. 计算机专业的学生应当如何规划他的专业学习

热门文章

  1. u盘魔术师给服务器装系统,U盘魔术师v5(USMv5)(带ISO独立版)
  2. 记录bat脚本启动IE11并启用ActiveX控件
  3. 跨国企业在中国 | 加特可苏州工厂开业生产尖端变速器;格拉默与一汽子公司办合资企业...
  4. 返回顶部浮动图标代码
  5. New 21 Game 新21点
  6. [置顶] 最近要强迫自己了解的东西
  7. NEFU要崛起——第16场 A - Triangle
  8. 陈欧侃:来自开源,反馈开源 —— “一铭杯”专访
  9. 设计一个LOL的英雄类,创建两个英雄对象,一个叫盖伦,一个叫提莫
  10. 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程