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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 我倒在了美团面试算法题:字符串大数相加

    我倒在了美团面试算法题:字符串大数相加

    2020年11月20日
    197
  • idea配置Tomcat时没有Artifacts选项

    idea配置Tomcat时没有Artifacts选项首先解释一下IDEA中的Artifact是什么?Artifacts是maven中的一个概念,表示某个module要如何打包,例如warexploded、war、jar、ear等等这种打包形式;好奇这个带不带exploded的有什么差别不?exploded在这里你可以理解为展开,不压缩的意思。也就是war、jar等产出物没压缩前的目录结构。这个是不带exploded的。和下图的框框对比下,就可以看到差别啦这两张图,意在说明,带exploded和不带的差别,一个是打包压缩,另.

    2022年10月18日
    1
  • python读取excel某一行内容_3dmax缺少外部文件怎么办

    python读取excel某一行内容_3dmax缺少外部文件怎么办python在读取Excel文件时默认会把第一行当做列名,所以导致会缺少一行。解决办法如下:加入header=None

    2022年9月13日
    0
  • 前端之路:bootstrap 时间日期日历控件(datetimepicker)

    前端之路:bootstrap 时间日期日历控件(datetimepicker)Bootstrap datetimepicker控件的使用1.支持日期选择,格式设定2.支持时间选择3.支持时间段选择控制4.支持中文涉及的样式及js:云加速外联即可。(moment-with-locales.js 这个得在datatimpicker.min.js之前。可以网上百度这个文件。我没找到这个cdn)&lt;linkhref="https://cdn.b…

    2025年7月26日
    0
  • HttpSession概述

    HttpSession概述什么是HttpSessionJavax.servlet.http.HttpSession接口表示一个会话,一个会话只能对应一个用户。我们可以把会话需要的共享数据保存到HttpSession中 获取HttpSession对象HttpSessionrequest.getSession():如果当前会话已经有了session对象,直接返回;如果没有则创建session并返回Htt…

    2022年7月12日
    17
  • 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]

    计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]在使用win7系统电脑的时间一长,出现的电脑故障也就会越多,这大多数都是用户自己所造成的,例如有用户的win7系统在运行过程中总是会出现严重卡顿的情况,这让许多用户都感到很难受,那么win7卡顿严重怎么解决呢?下面小编就来告诉大家win7运行卡顿严重最流畅设置方法。具体方法:1、右击【计算机】选择属性;2、在出现的面板的左侧栏选择【高级系统设置】;3、依次点击【高级】【设置】;4、默认是【让系统选…

    2022年9月12日
    0

发表回复

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

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