PHP快速实战20-PHP7中的垃圾回收机制与原理讲解

news2024/11/23 10:45:38

文章目录

  • 前言
  • PHP垃圾回收实现的原理
    • 垃圾回收机制
      • 引用计数
      • 循环垃圾收集
    • 实现原理
  • 总结


前言

本文已收录于PHP全栈系列专栏:PHP快速入门与实战

在计算机程序中,垃圾回收指的是一种自动管理内存的技术。在程序执行过程中,分配给它的内存会随着对象的创建和销毁不断发生变化,如果没有垃圾回收,这些不再被使用的内存会一直占用系统资源,最终导致系统崩溃。
在这里插入图片描述

因此,垃圾回收是保证程序稳定运行和保护计算机系统的必要措施。通过及时回收不再使用的内存,程序中可用的内存空间将被优化使用,从而提高程序的执行效率,并避免由于内存泄漏等问题导致的系统崩溃或其他错误。

在这篇博客中,我们将介绍PHP7中的垃圾回收原理。

PHP垃圾回收实现的原理

垃圾回收机制

PHP7采用了新的垃圾回收机制,该机制主要分为两部分:引用计数循环垃圾收集

引用计数

引用计数是一种简单的垃圾回收机制,它统计变量或对象在代码中被引用的次数,当引用次数为0时就可以将其释放。这种机制虽然简单,但是会存在循环引用的问题,即两个对象相互引用,但其引用计数都不为0,导致内存泄漏。

循环垃圾收集

针对循环引用问题,PHP7采用了另一种垃圾回收机制——循环垃圾收集。循环垃圾收集通过遍历变量或对象之间的引用关系,判断是否存在循环引用关系,如果存在就将其标记为“垃圾”,最后再将其清理掉。

具体实现上,PHP7使用了底层C语言的源码来实现该垃圾回收机制。其中,引用计数通过对变量或对象的指针进行计数实现,当引用次数为0时,就调用相应的析构函数来释放资源。循环垃圾收集则是由GC(Garbage Collector)模块负责实现,在PHP脚本执行过程中,GC会周期性地执行垃圾回收操作,遍历所有内存分配单元,找出不再被任何变量或对象引用的内存块,并将其释放掉。

实现原理

PHP7的垃圾回收机制使用了一种叫做“引用计数”的算法。这种算法的基本思想是,每个变量都有一个引用计数器,记录有多少个变量指向了它。当一个变量被赋值给另一个变量时,两个变量的引用计数都会加1;当一个变量被销毁时,指向它的变量的引用计数会减1。当一个变量的引用计数为0时,它就可以被垃圾回收。

下面是PHP7使用的引用计数算法的C语言源码:

typedef struct _zend_refcounted {
    int          refcount;  // 引用计数
    union {
        uint32_t   type_info; // 类型信息,用于判断对象类型
        uint32_t   extra;     // 额外的数据,用于一些特殊情况
    } u;
} zend_refcounted;

typedef struct _zend_string {
    zend_refcounted   gc;     // 引用计数器和类型信息
    size_t            len;    // 字符串长度
    char              val[1]; // 字符串内容
} zend_string;

在上面的代码中,zend_refcounted结构体包含了一个refcount成员,用来记录引用计数。而具体的变量类型,如字符串、数组、对象等,都包含了一个zend_refcounted结构体成员作为引用计数器。当一个变量需要销毁时,会先将它的引用计数减1,如果此时引用计数为0,说明这个变量可以被垃圾回收了。

总结

在这里插入图片描述

以上就是关于本篇文章介绍的内容,PHP7中的垃圾回收机制与原理讲解,后续更多内容将收录在专栏PHP快速入门与实战中,感谢大家支持。喜欢记得三联哟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年软件测试趋势?测试人的发展前景?“我“到底该如何走...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 现在开始学习软件…

NetSuite 中国财务常用报表功能包

目录 1.致谢 2.功能说明 2.1 概述 2.2 报表说明 3.安装 4.操作指南 4.1 CLR_资产负债表 4.2 CLR_资产负债表(期初/发生/结余) 4.3 CLR_利润表 4.4 CLR_利润表季报 4.5 CLR_现金流量表 4.6 CLR_现金流量表季报 4.7 CLR_总账 4.8 CLR_序时账…

《消息队列高手课》课程学习笔记(八)

如何实现高性能的异步网络传输? **异步与同步模型最大的区别是,同步模型会阻塞线程等待资源,而异步模型不会阻塞线程,它是等资源准备好后,再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法,…

深入理解深度学习——注意力机制(Attention Mechanism):注意力评分函数(Attention Scoring Function)

分类目录:《深入理解深度学习》总目录 《深入理解深度学习——注意力机制(Attention Mechanism):注意力汇聚与Nadaraya-Watson 核回归》中使用了高斯核来对查询和键之间的关系建模。式中的高斯核指数部分可以视为注意力评分函数&a…

Spark笔记

DBeaver数据库连接器 Download | DBeaver Community shell命令 bin/spark-submit –class cn.edu.ncut.sparkcore.wordcount.Test03_WordCount_cluster –deploy-mode cluster –master yarn ./sparkcore-1.0-SNAPSHOT.jar 10 血缘关系查看 toDebugString()&#xff1a…

深入篇【Linux】学习必备:【文本编辑器】vim的基本介绍及使用

深入篇【Linux】学习必备:【文本编辑器】vim的基本介绍及使用 Ⅰ.vim基本简介Ⅱ.vim的基本操作⏰【命令模式下】1.移动光标2.复制删除粘贴3.替换更改4.撤销指令 ⏰【底行模式下】1.查找字符2.保存退出3.查看所有模式 Ⅲ.简单vim配置1.配置文件位置2.使用插件 Ⅰ.vim…

前后端交互三、Ajax加强

零、文章目录 前后端交互三、Ajax加强 1、XMLHttpRequest的基本使用 (1)什么XMLHttpRequest XMLHttpRequest(简称 xhr)是浏览器提供的 Javascript 对象,通过它,可以请求服务器上的数据资源。jQuery 中的…

力扣 209. 长度最小的子数组

一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target。 找出该数组中满足其和大于等于 target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。 示例 1: 输入:target 7, nums [2,3,1…

Servlet详解

目录 一. Servlet介绍 1.1 概念 2.2 Servlet架构 二. 创建一个Servlet程序 2.1 创建一个Maven项目 2.2 引入 jar 包 2.3 创建目录 2.4 编写代码 2.5 打包程序 2.6 部署程序 2.7 验证程序 三. Servlet常用API 3.1 HttpServlet 3.2 HttpServletRequest 3.2 HttpServlet…

深入了解SSM框架(案例(SSM+Jsp) + 详细分析 + 思维导图)

1.Spring Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。 Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地new一个…

swagger 接口测试,用 python 写自动化时该如何处理?

在使用Python进行Swagger接口测试时,可以使用requests库来发送HTTP请求,并使用json库和yaml库来处理响应数据。以下是一个简单的示例代码: 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站百万播…

vim编辑器基本使用

一、写在前面 今天在练习git相关操作时,无意间发现当你使用commit命令提交代码时,忘记添加备注信息会自动进入一个奇怪的模式,按esc键亦或是ctrlC都无法退出,这个奇怪的模式也就是vim编辑器。如下图: vim是一种文本…

前端工程化-VUE

前端工程化-VUE Vue-cliNode.js1.什么是Node.js2.Node.js的安装 高效的开发离不开基础工程的搭建。本章主要介绍如何使用Vue进行实际SPA项目的开发,这里使用的是目前热门的JavaScript应用程序模块打包工具Webpack,进行模块化开发、…

嵌入式C语言中if/else如何优化详解

观点一(灵剑): 前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅…

Spring 源码解析 - FactoryBean 获取 Bean 过程

一、FactoryBean FactoryBean是Spring框架提供的一个核心接口之一,用来创建复杂或无法通过默认构造函数创建的对象。这种情况下通过实现FactoryBean接口,可以自定义实例化Bean的过程,包括Bean的对象类型、初始化、销毁等。 在应用场景中&am…

RK3588平台开发系列讲解(进程篇)程序的二进制格式 ELF

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、ELF 文件二、二进制文件组成三、运行程序为进程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢CPU 是不能执行文本文件里面的指令的,这些指令只有人能看懂,CPU 能够执行的命令是二进制的,比如“0101”…

Selenium还能这么玩:自动管理浏览器

这是个系列文章,主要讲selenium一些实战操作,使用 Python 编写代码。可以把他们应用到自动化测试,也可以应用到网络爬虫中。 这篇文章介绍一个操作,可以让selenium 控制浏览器共用同一个 session。他的应用场景是:共用…

pwn3-绕过防御-ROP(1)

**ROP:**全程Return Oriented Programming(面向返回的编程),在栈溢出基础上,利用程序中已有的小片段(gadgets),改变寄存器或变量的值,从而控制程序执行流程,从而绕过NX防御,常见有ret2text,ret2…

Linux:samba服务 (smbd)

smb服务器为centos7 使用的yum安装(如果不会搭建本地yum仓库可以查看) Linux:rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 samba 简介 samba 使用了 1.SMB 协议 Server Message Block,服务消息块 2…

【LeetCode】769. 最多能完成排序的块

769. 最多能完成排序的块(中等) 方法一:贪心 思路 由于arr是[0,..., n-1] 的一个排列,若已遍历过的数中的最大值 max 与当前遍历到的下标相等,说明可以进行一次分割,累加答案。 代码 class Solution { …