phpCOW机制详解
写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作,从而实现对内存的优化使用。
写时复制的作用
以下是一段代码:
|
也就是说,就算我们不使用引用,php变量在传值,赋值的情况,都是指向同一个内存,但是如果当$arr_copy的值改变了会怎么样呢?<?php
|
结果如下:(注意:该结果是php5.6web环境下的,php7的引用不同)
可看出,当$arr把值赋值给$arr_copy时,执行内存是没有明显变化的,并没有直接增加5443320内存量
甚至在之后的foreach遍历中,也是没有增加内存的.
因为当$arr赋值给$arr_copy时,并不是在内存中复制了整个$arr的值,而是将$arr_copy的值指向了$arr,相当于在取$arr_copy的数据时,指向的还是$arr存值的内存
也就是说,就算我们不使用引用,php变量在传值,赋值的情况,都是指向同一个内存,但是如果当$arr_copy的值改变了会怎么样呢?
|
结果如下:(注意:该结果是php5.6web环境下的,php7的引用不同)
可以看出,当$copy[0]值改变时,php将会给$copy[0]重新申请内存,然后赋之以新值,但不影响其他值的内存状态。
写时复制的最小粒度,就是zval结构体, 而对于zval结构体组成的集合(如数组和对象等),在需要复制内存时,将复杂对象分解为最小粒度来处理。
这样做就使内存中复杂对象中某一部分做修改时,不必将该对象的所有元素全部“分离”出一份内存拷贝, 从而节省了内存的使用。
(文中的xdebug_debug_zval是xdebug扩展中的函数,用于查看变量的引用信息)
以上就是phpCOW机制详解的详细内容,更多请关注php中文网其它相关文章!
最新文章
- Anti XSS 防跨站脚本攻击库
- 浅谈MITM攻击之信息窃取(解密315晚会报道的免费WIFI窃取个人信息)
- 原生js完成拼图小游戏
- Ubuntu 16.04 安装mysql并设置远程访问
- 生成均值文件mean.binaryproto
- 基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)
- FIR.im Weekly - 让炫酷 UI 为 APP 增色
- SVN和Git的比较
- tomcat字符,文档,数据库配置
- ios coredata 老代码备用参考
- mysql/Java服务端对emoji的支持
- Eclipse 常用快捷键 (动画讲解)(转载)
- 《Linux命令行与shell脚本编程大全》 第十八章 学习笔记
- Spring 事务管理笔记
- JavaWeb学习之JDBC API中常用的接口和类
- python 错误:";&#39;NoneType&#39; object has no attribute &#39;execute&#39;";
- SpringBoot 上传文件夹
- SQL Server 2017 安装详解
- Python3 - 基础知识、基本了解
- 雷林鹏分享:XML 用途
热门文章
- 创建一个学生表student,默认的表空间为users,字段自定,同时为表的各个字段分别添加合适的约束,然后测试约束的验证状态。
- python读取Excel表格文件
- 字符串KMP算法
- 【POJ】2253 Frogger
- Neo4j中實現自定義中文全文索引
- Navicat Premium_11.2.7 安装及破解,连接Oracle数据库
- Android App上架流程
- Java 基础 - Object.clone()深拷贝和浅拷贝
- 树形dp——cf1092F
- chattr和lsattr命令,不能被删除、改名、设定链接关系,同时不能写入或新增内容