返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php如何引用计数实现垃圾回收
  • 937
分享到

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

2023-06-15 11:06:55 937人浏览 安东尼
摘要

这篇文章主要为大家展示了“PHP如何引用计数实现垃圾回收”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何引用计数实现垃圾回收”这篇文章吧。1、实现说明给对象添加引用计数器,每次在某个地方

这篇文章主要为大家展示了“PHP如何引用计数实现垃圾回收”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何引用计数实现垃圾回收”这篇文章吧。

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编程频道!

--结束END--

本文标题: php如何引用计数实现垃圾回收

本文链接: https://lsjlt.com/news/279975.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php如何引用计数实现垃圾回收
    这篇文章主要为大家展示了“php如何引用计数实现垃圾回收”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何引用计数实现垃圾回收”这篇文章吧。1、实现说明给对象添加引用计数器,每次在某个地方...
    99+
    2023-06-15
  • Python的垃圾回收机制(引用计数+标
    我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念。在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyObject。 typedef struct_obje...
    99+
    2023-01-31
    机制 垃圾 Python
  • Python 垃圾回收机制中的引用计数
    Python 中的 __del__ 魔法方法,也被称为对象的终结者,是一个在对象即将被从内存中移除之前被调用的方法。它实际上并不做从内存中删除对象的工作,我们将在后面看到它是如何发生的。相反,这个方法是用来做任何在对象被移除前需要发生的清理...
    99+
    2023-05-14
    Python 内存 引用计数
  • 如何理解Java垃圾回收
    这篇文章主要介绍“如何理解Java垃圾回收”,在日常操作中,相信很多人在如何理解Java垃圾回收问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java垃圾回收”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • PHP中垃圾回收相关函数的使用
    目录再谈循环引用以及强制清理循环引用开启、关闭及查看循环引用垃圾回收状态强制回收Zend引擎内存管理器使用的内存获取垃圾收集器的信息测试代码:相关文章之前我们已经学习过 PHP 中的...
    99+
    2024-04-02
  • JavaScript垃圾回收机制(引用计数,标记清除,性能优化)
    目录一、前言二、何为垃圾三、垃圾回收四、可达性(Reachability)五、可达性举例层次关联相互关联可达孤岛六、垃圾回收算法引用计数标记清除七、性能优化分代回收增量收集空闲收集八...
    99+
    2024-04-02
  • Python垃圾回收是怎么实现的
    目录什么是垃圾回收 Python中的垃圾回收机制 引用计数 循环引用 标记清除解除循环引用 分代回收 总结 什么是垃圾回收 垃圾回收(GC) 大家应该多多少少都了解过,什么是垃圾回...
    99+
    2024-04-02
  • golang垃圾回收算法怎么实现
    Go语言的垃圾回收(Garbage Collection)是由Go语言的运行时系统(runtime system)自动进行的,开发者...
    99+
    2023-10-23
    golang
  • 如何理解Dotnet的垃圾回收
    本篇内容介绍了“如何理解Dotnet的垃圾回收”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在说垃圾回收之...
    99+
    2024-04-02
  • 使用php7怎么实现垃圾回收机制
    这篇文章给大家介绍使用php7怎么实现垃圾回收机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。zval 的结构// php 变量对于的c结构体struct _zval_struct&nb...
    99+
    2023-06-15
  • 怎么在PHP中实现一个垃圾回收机制
    这篇文章给大家介绍怎么在PHP中实现一个垃圾回收机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。顽固垃圾的产生过程<php  $a = "new st...
    99+
    2023-06-06
  • .Net的GC垃圾回收原理及实现
    一、先了解下必备的知识前提 内存中的托管与非托管,可简单理解为: 托管:可借助GC从内存中释放的数据对象(以下要描述的内容点) 非托管:必须手工借助Dispose释放资源(实现自ID...
    99+
    2024-04-02
  • go的垃圾回收算法怎么实现
    Go语言的垃圾回收是通过标记-清除(Mark and Sweep)算法实现的。下面是具体的实现步骤: 标记阶段:首先,垃圾回收器...
    99+
    2023-10-25
    go
  • C++如何解决垃圾回收问题
    本篇内容介绍了“C++如何解决垃圾回收问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! C++引用计数...
    99+
    2024-04-02
  • 如何降低Java垃圾回收开销
    这篇文章主要介绍“如何降低Java垃圾回收开销”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何降低Java垃圾回收开销”文章能帮助大家解决问题。 Tip #1:...
    99+
    2024-04-02
  • PHP中垃圾回收相关函数的使用案例
    这篇文章主要介绍PHP中垃圾回收相关函数的使用案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon...
    99+
    2023-06-14
  • python中的垃圾回收机制怎么实现
    这篇文章主要讲解了“python中的垃圾回收机制怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的垃圾回收机制怎么实现”吧!python采用的是引用计数机制为主,标记-清...
    99+
    2023-06-28
  • java垃圾回收之实现串行GC算法
    我们可以选择JVM内置的各种算法。如果不通过参数明确指定垃圾收集算法, 则会使用宿主平台的默认实现。本章会详细介绍各种算法的实现原理。 下面是关于Java 8中各种组合的垃圾收集器概...
    99+
    2024-04-02
  • java垃圾回收之实现并行GC算法
    Parallel GC(并行GC) 并行垃圾收集器这一类组合, 在年轻代使用 标记-复制(mark-copy)算法, 在老年代使用 标记-清除-整理(mark-s...
    99+
    2024-04-02
  • Python底层技术解析:如何实现垃圾回收机制
    Python底层技术解析:如何实现垃圾回收机制,需要具体代码示例引言:Python作为一种高级编程语言在开发中极为方便和灵活,但是其底层实现却是相当复杂的。本文将重点探讨Python的垃圾回收机制,包括垃圾回收的原理、算法以及具体的实现代码...
    99+
    2023-11-08
    Python 垃圾回收 底层技术
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作