php写时拷贝,PHP的引用计数和写时复制

本文详细介绍了PHP的垃圾回收机制,特别是引用计数和写时复制的概念。通过示例代码展示了如何在PHP中跟踪变量的引用计数变化,并解释了当值发生改变时如何触发内存的重新分配。这一特性优化了内存使用,提高了PHP的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道PHP的GC是通过对变量和值的引用计数来实现的,当引用计数减少至0时,PHP进程将会将变量所占用的内存进行回收,返回给Zend。参考:  https://my.oschina.net/u/3412738/blog/1529301 . 下面,我们再来看看它的写时复制机制。

$a = 1;

xdebug_debug_zval('a');

$b = $a;

xdebug_debug_zval('a');

$a = 2;

xdebug_debug_zval('a');

xdebug_debug_zval('b');

结果如下:

a: (refcount=1, is_ref=0)=1

a: (refcount=2, is_ref=0)=1

b: (refcount=1, is_ref=0)=2

a: (refcount=1, is_ref=0)=1

过程分析:

1,$a 创建了 引用计数(指向数)为1,非地址引用 并且 值为int类型 1 的 zval容器;

2,新建一个$b,由于是通过赋值的方式将 $a 赋值给 变量$b 的,两个变量所保存的值完全一样,因此不会申请新内存来存放新变量所保存的值,而是简单的通过一个计数器来共用内存。所以,此时$b也指向 $a 的zval 容器,可以看到引用计数变为了2,仍然是非地址引用;

3,将$a的值赋值为 2,值发生了该表,由于该zval 容器非地址引用,所以系统会重新创建一个 引用计数(指向数)为1,非地址引用并且值为int类型2 的新的zval 容器 指向$a  ,由于 $a 不再指向原zval容器,所以原容器的 引用计数(指向数) 减 1。

总结: 当通过值传递方式进行赋值时,由于两个变量保存的值完全一样,为了 复用内存,PHP不会为新变量申请新的内存来存放值,而只是在原 zval 容器中将引用计数+1。只有当两个变量中的任何一个变量的值发生改变时,PHP才会重新为发生 值改变 的那个变量申请一个新内存,创建一个新的zval容器。

以上内容 就是php内核的一个重要的特性:引用计数 与 写时复制 原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值