phpCOW机制详解

phpCOW机制详解

写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作,从而实现对内存的优化使用。

 

写时复制的作用

以下是一段代码:

<?php

var_dump(memory_get_usage());//先打印出当前内存情况

$arr = array_fill(0, 100000, 'tioncico');//生成一个0-100000键的数组

var_dump(memory_get_usage());//打印内存

$arr_copy = $arr;//把数组赋值给另一个

var_dump(memory_get_usage());//打印内存

$j=1;

foreach($arr_copy as $i) {
//循环遍历该数组键值查看内存情况

    $j += count($i);

}

var_dump(memory_get_usage());//打印内存

 

也就是说,就算我们不使用引用,php变量在传值,赋值的情况,都是指向同一个内存,但是如果当$arr_copy的值改变了会怎么样呢?<?php

var_dump(memory_get_usage());

//$tipi = array_fill(0, 3, 'php-internal');

//不用array_fill的原因可自己试着打印下

$tipi[0]='php-internal';

$tipi[1]='php-internal';

$tipi[2]='php-internal';

  

var_dump(memory_get_usage());

  

$copy = $tipi;

  

xdebug_debug_zval('tipi', 'copy');

  

var_dump(memory_get_usage());

  

$copy[0] = '123';

  

xdebug_debug_zval('tipi', 'copy');

  

var_dump(memory_get_usage());

 

结果如下:(注意:该结果是php5.6web环境下的,php7的引用不同)

可看出,当$arr把值赋值给$arr_copy时,执行内存是没有明显变化的,并没有直接增加5443320内存量

甚至在之后的foreach遍历中,也是没有增加内存的.

因为当$arr赋值给$arr_copy时,并不是在内存中复制了整个$arr的值,而是将$arr_copy的值指向了$arr,相当于在取$arr_copy的数据时,指向的还是$arr存值的内存

也就是说,就算我们不使用引用,php变量在传值,赋值的情况,都是指向同一个内存,但是如果当$arr_copy的值改变了会怎么样呢?

 

<?php

var_dump(memory_get_usage());

//$tipi = array_fill(0, 3, 'php-internal');

//不用array_fill的原因可自己试着打印下

$tipi[0]='php-internal';

$tipi[1]='php-internal';

$tipi[2]='php-internal';

 

var_dump(memory_get_usage());

 

$copy = $tipi;

 

xdebug_debug_zval('tipi', 'copy');

 

var_dump(memory_get_usage());

 

$copy[0] = '123';

 

xdebug_debug_zval('tipi', 'copy');

 

var_dump(memory_get_usage());

结果如下:(注意:该结果是php5.6web环境下的,php7的引用不同)

仙士可博客

可以看出,当$copy[0]值改变时,php将会给$copy[0]重新申请内存,然后赋之以新值,但不影响其他值的内存状态。 写时复制的最小粒度,就是zval结构体, 而对于zval结构体组成的集合(如数组和对象等),在需要复制内存时,将复杂对象分解为最小粒度来处理。 这样做就使内存中复杂对象中某一部分做修改时,不必将该对象的所有元素全部“分离”出一份内存拷贝, 从而节省了内存的使用。

(文中的xdebug_debug_zval是xdebug扩展中的函数,用于查看变量的引用信息)

以上就是phpCOW机制详解的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112713.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • k8s支持的存储_k8s安装与配置与优化

    k8s支持的存储_k8s安装与配置与优化k8sPV和PVC概述PVPVC生命周期配置存储ConfigMapSecretPV和PVC概述前面我们已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全部掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用,kubernetes引入了PV和PVC两种资源对象。PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创

    2022年8月11日
    5
  • 汇编学习 NO6

    汇编学习 NO61 ret 用栈中的数据 修改 IP 内容 从而实现近转移 2 retf 用栈中的数据 修改 CS 和 IP 中的内容 从而实现远转移 3 CPU 执行 ret 指令相当于 popIP 执行 retf 指令相当于 popIPpopCS4 call 指令 CPU 执行 call 指令时 进行两步操作 将当前的 IP 或 CS 和 IP 压入栈中 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp

    2026年2月3日
    0
  • Google Maps_Google桌面搜索

    Google Maps_Google桌面搜索GoogleBuzz从诞生那天起就跟位置服务紧密连接在了一起,我们可以在移动GoogleMaps里看到大家都在哪里发送Buzz(只要他们发送的时候让Google记录自己的位置),这个功能非常有趣,特别是在某些特殊事件发生之时,可以按照位置看到某个区域里的人们都在想什么做什么(而不是按照timeline的传统方式)。今天,Google在桌面地图服务里也开放了Buzz图层(之…

    2022年10月15日
    5
  • 最简单方法将项目上传到github

    最简单方法将项目上传到github

    2021年10月10日
    53
  • SSM整合 运行报Handler dispatch failed; nested exception is java.lang.AbstractMethodError: Method com/mcha「建议收藏」

    SSM整合 运行报Handler dispatch failed; nested exception is java.lang.AbstractMethodError: Method com/mcha「建议收藏」今天在整合SSM的时候,在运行过程中出现了如下错误:org.springframework.web.util.NestedServletException:Handlerdispatchfailed;nestedexceptionisjava.lang.AbstractMethodError:Methodcom/mchange/v2/c3p0/impl/NewProxyResultSet.isClosed()Zisabstract org.springframewor.

    2022年5月5日
    156
  • 记一次 Centos7 安装使用 PostWoman

    记一次 Centos7 安装使用 PostWoman一、简介官网:https://www.worldlink.com.cn/osdir/postwoman.htmlDEMO:https://postwoman.io/GITHUB下载:https://github.com/liyasthomas/postwoman二、使用工具1、操作系统Centos7.4x64Minimal1708安装1台虚拟机:2G内存1…

    2025年7月5日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号