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 ...
最新文章
- OAM Kubernetes 标准实现与核心依赖库发布 | 云原生生态周报 Vol. 52
- pe如何自动加载外置工具_如何自动加载网站的深色模式?
- Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?
- python import 路径_Python 从相对路径下import的方法
- Ubuntu开启SSHD服务
- MATLAB 三路频分复用通信系统
- 现在的钱真的那么容易挣了吗?
- c++ gdb 绑定源码_gdb调试g++ -g生成文件,list后不能看到源代码
- 【LeetCode】【数组】题号:485,最大连续1的个数
- 闭包基础概念,闭包详解
- 寻找代理服务器的常用软件
- 【笔记篇】01初识供应链——之《实战供应链》
- linux centos 架构,CentOS Linux 7.5 (build 1804) 现可用于IBM POWER9体系架构
- linux tcp调优
- 《七哥说道》第八章:约在410,北漂可还行?
- 苏格拉底、柏拉图、亚里士多德,走进希腊三贤的世界
- 英语专家谈英语学习方法
- 利用CSS设置文字的阴影效果
- R语言工具变量与两阶段最小二乘法
- 计算机专业的学生应当如何规划他的专业学习
热门文章
- u盘魔术师给服务器装系统,U盘魔术师v5(USMv5)(带ISO独立版)
- 记录bat脚本启动IE11并启用ActiveX控件
- 跨国企业在中国 | 加特可苏州工厂开业生产尖端变速器;格拉默与一汽子公司办合资企业...
- 返回顶部浮动图标代码
- New 21 Game 新21点
- [置顶] 最近要强迫自己了解的东西
- NEFU要崛起——第16场 A - Triangle
- 陈欧侃:来自开源,反馈开源 —— “一铭杯”专访
- 设计一个LOL的英雄类,创建两个英雄对象,一个叫盖伦,一个叫提莫
- 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程