当前位置: 首页 > news >正文

PHP垃圾回收机制

PHP垃圾回收机制

1、每一个变量定义时都保存在一个叫zval的容器里面,这里面包含了数量的类型和和值,还包含了一个refcount(理解为存在几个变量个数)和is_ref(理解为是否为引用变量)两个额外信息,当变量被引用一次refcount就会+1,当你unset一下之后这个值就会减1直到为0就会从内存中删除

2、定义一个变量的时候并不是每次都会扩大预定于值,因为PHP会在内存中先预占用一个空间,等你声明变量的时候就会分配给你,但是当你超出这个预占用空间之后,那么它就会增加空间,但是等你删除变量时候这个空间容量不会立即消失

3、变量的引用不会单独的多增加内存占用,它会指向zval结构体,只是refcount+1

4、简单说说,PHP的变量依赖于一个内部实现

symbol_table 符号表,而符号表的基础实现是 HashTable

,也就是和PHP数组的基础实现是一致的。真是因为符号表的存在,让我们可以使用global标记全局变量,用如compact等函数直接从当前符号表中拉出变量出来。

那在谈谈题主说的unset($a)会不会马上释放空间,答案是否定的,unset支持从符号表中把名字为a的这个元素删掉了(只是标记这块空间又可用了,而不是释放空间)。

再说循环中重复更新$key这种情况,因为更新的是相同名字的变量,所以在符号表中他们是同一个元素,更新时就会更新相同的位置,之前元素的值就马上被覆盖了。

再说说申明了新的变量内存就会增加这个问题,答案是不确定。这是符号表基于

HashTable 实现的特性所致, HashTable

并不是增加一个元素就申请一个元素的内存,而是一次申请多个元素的内存(只是这些位置标记是未使用),而当 HashTable

被塞满时,再去申请新的多个元素的内存。也就是说,当我们申明或者赋值一个变量时,如果它不在符号表中,PHP会将它加入到符号表里,而如果这时候符号表没满,那会采用符号表中已申请而未使用的内存,如果符号表刚好的满的,则会申请新的内存出来存放,而新的内存不仅仅只有这个变量需要的内存这么小



640
640

相关文章:

  • SpringCloud |第三篇: 服务消费者(Feign+REST)
  • Android请求网络数据下载APK安装包
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 技术相对论之软件架构
  • Fragment 生命周期怎么来的?
  • Redis和Memcache和MongoDB简介及区别分析(整理)
  • ubuntu16.4安装最新版wine3.0
  • c++中局部变量初始化的问题
  • WordCount
  • 外卖也智能!美团骑手智能助手的技术与实践
  • 【协议转换和消息路由】camel-spring-boot-starter 实践
  • 坑货!阿里奇门中心
  • [ssh]如何设计ARM板上多用户key登录系统
  • 71. Simplify Path
  • numpy 数组运算
  • 【Leetcode】101. 对称二叉树
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • ES6系列(二)变量的解构赋值
  • es6要点
  • HTML5新特性总结
  • Java Agent 学习笔记
  • JSONP原理
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Node项目之评分系统(二)- 数据库设计
  • Rancher-k8s加速安装文档
  • redis学习笔记(三):列表、集合、有序集合
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 跨域
  • 前嗅ForeSpider中数据浏览界面介绍
  • 无服务器化是企业 IT 架构的未来吗?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • ${factoryList }后面有空格不影响
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (145)光线追踪距离场柔和阴影
  • (第二周)效能测试
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (利用IDEA+Maven)定制属于自己的jar包
  • (四)Controller接口控制器详解(三)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转) Face-Resources
  • .cfg\.dat\.mak(持续补充)
  • .gitignore文件—git忽略文件
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Web项目创建比较不错的参考文章
  • .net 受管制代码
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net操作Excel出错解决
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)