当PHP线程结束时,当前占用的所有内存空间都将被销毁,如果线程未完成,如何恢复内存

引用计数:引用的技术员,也可以理解为指针的容器数量。

is_ref:这是引用(0或1)

作业流程:


< PHP
$ =AA;
xdebug_debug_zval(一); / /(引用计数为1,is_ref = 0),string'aa(长度= 6)
美元=美元;
下面的两个是可变容器。
xdebug_debug_zval(一); / /(引用计数为2,is_ref = 0),string'aa(长度= 6)
xdebug_debug_zval(B); / /(引用计数为2,is_ref = 0),string'aa(长度= 6)
unset($); / /变容器的引用计数减1
xdebug_debug_zval(一); / /(引用计数为1,is_ref = 0),string'aa(长度= 6)
xdebug_debug_zval(B); / / B:没有这样的符号B变量被破坏,被打破,如果相应的参考容器技术是零,那么记忆的碎片回收
美元=美元;
$ = 'BB';
xdebug_debug_zval(一); / /(引用计数为1,is_ref = 0),string'aa(长度= 6)
xdebug_debug_zval(B); / /(引用计数为1,is_ref = 0),string'aa(长度= 6)重新申请一个可变容器储存B可变容器参考减1




引用过程:


< PHP
$ =AA;
xdebug_debug_zval('a'); / /(引用计数为1,is_ref = 0),string'aa(长度= 2)
美元=美元;
变量容器引用技术和1个引用标记设置为1。
xdebug_debug_zval('a'); / /(引用计数为2,is_ref = 1),string'aa(长度= 2)
xdebug_debug_zval(B); / /(引用计数为2,is_ref = 1),string'aa(长度= 2)
$ = '123;
/ / PHP会发现容器变量是一个引用(is_ref),所以容器变量没有申请另一个赋值。
xdebug_debug_zval('a'); / /(引用计数为2,is_ref = 1),'123字符串(长度= 2)
xdebug_debug_zval(B); / /(引用计数为2,is_ref = 1),'123字符串(长度= 2)
unset($);
变量容器应用程序引用零计数减1。
xdebug_debug_zval('a'); / /(引用计数为1,is_ref = 0),'123字符串(长度= 2)
xdebug_debug_zval(B); / / B:没有这样的符号




如果这么多引用,未降,is_ref将被设置为零,这样的错误不会出现变量容器或引用。让我们来看看它。


< PHP
$ =AA;
美元=美元;
美元=美元;
你可以看到参考 / /引用计数为3,is_ref总是1
xdebug_debug_zval('a'); / /(引用计数为3,is_ref = 1),string'aa(长度= 2)
xdebug_debug_zval(B); / /(引用计数为3,is_ref = 1),string'aa(长度= 2)
xdebug_debug_zval(C); / /(引用计数为3,is_ref = 1),string'aa(长度= 2)

unset($);
期待我们的错误/不,只是引用计数减1,或1 is_ref
xdebug_debug_zval('a'); / /(引用计数为2,is_ref = 1),string'aa(长度= 2)
xdebug_debug_zval(B); / / B:没有这样的符号
xdebug_debug_zval(C); / /(引用计数为2,is_ref = 1),string'aa(长度= 2)
那怎么知道这 / / PHP的容器和参考,毕竟is_ref仍然是1,不算,所以现在引用计数中发挥作用,这是对PHP的变量的引用,但是,如果我做的不好的事情,在参考时间,和分配,它将有一个bug
$ = $ a;
我们看到预期的错误 / /或没有,这个任务,如直接分配这么简单的引用计数加1,但一个新的变量的容器
xdebug_debug_zval('a'); / /(引用计数为2,is_ref = 1),string'aa(长度= 2)
xdebug_debug_zval(e); / /(引用计数为1,is_ref = 0),string'aa(长度= 2)




可以设置并分配空回收变量很多人认为所有这两个都可以检索变量空间。实际上,null只是改变变量所占据的空间。从回收的角度来看,集装箱仍然存在。


< PHP
$ =AA;
美元=美元;
$ = null;
应用另一个变量容器
xdebug_debug_zval('a'); / /(引用计数为1,is_ref = 0),string'aa(长度= 2)
xdebug_debug_zval(B); / /(引用计数为1,is_ref = 0),零变量空间还没有被找到
unset($);
这时,释放了可变容器空间。
xdebug_debug_zval('a'); / /(引用计数为1,is_ref = 0),string'aa(长度= 2)
xdebug_debug_zval(B); / / B:没有这样的符号




总结

1。垃圾收集时间

在PHP中,引用计数为0,那么内存是立即释放。换句话说,没有循环引用变量,把变量的范围,和记忆是立即释放。循环参考检测触发一定的条件下,所以在上面的例子中,会有记忆中用一个大的波动,gc_collect_cycles函数也可以被用来积极开展循环引用的检测。

2的影响。符号

对变量的显式引用增加了内存的引用计数:

$;

美元=美元;

此时unset(美元),但仍有一个参考,B点美元到存储区域,和记忆将不会被释放。

3的影响。设置功能

不只是一个连接,断开一个变量存储区。同时,内存区域的引用计数为1。在上面的例子中,美元=新一()和复位(美元)在循环体内不减少美元计数为零。

4。=空操作的效果;

$ = NULL是空的直接指向$ A的数据结构,同时计数其参考计数为0。

5。脚本执行结束的效果

脚本被执行,脚本中使用的所有内存都将被释放,不管是否有一个引用环。