本文主要是介绍通过代码看懂php内存分配机制,以及 unset 和 对内存的影响,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下面代码的运行环境,需要安装xdebug.so 才可以正常运行。
<?
#php中保存变量的内部表示结构体可以想像成struct zval{refcount=0,is_ref=0,data=''} 官方手册称之为变量容器
#-----------------------内存分配机制--------------------------
echo "\n";
echo "0--",memory_get_usage(),"\n";
$a = null;
xdebug_debug_zval('a');
echo "0--",memory_get_usage(),"\n";
输出:
0--391936
a: (refcount=1, is_ref=0)=NULL
0--392016
echo "\n";
echo "1--",memory_get_usage(),"\n";
#$a = '11111111111111111111111111111111111111111111111111';
$a = '11111111';
xdebug_debug_zval('a');
echo "2--",memory_get_usage();"\n";#字符变量初次分配16b,之后每超1次增加8b
输出:
1--392016
a: (refcount=1, is_ref=0)='11111111'
1--392040
echo "\n\n";
echo "2--",memory_get_usage(),"\n";
$b = $a;#这里没有复制变量,只是将$b的zval指向了$a的zval
xdebug_debug_zval('a');
xdebug_debug_zval('b');
echo "2--",memory_get_usage(),"\n";
输出:
2--392040
a: (refcount=2, is_ref=0)='11111111'
b: (refcount=2, is_ref=0)='11111111'
2--392088
echo "\n";
echo "3--",memory_get_usage(),"\n";
$a = '';#对$a或$b任一引zval的变量赋值都会有新的zval生成,即生成新的内存空间。
xdebug_debug_zval('a');
xdebug_debug_zval('b');
echo "3--",memory_get_usage(),"\n";
输出:
3--392088
a: (refcount=1, is_ref=0)=''
b: (refcount=1, is_ref=0)='11111111'
3--392136
#----------------------unset和& 对内存的影响-----------------------
echo "\n";
echo "4--",memory_get_usage(),"\n";
$c=&$a;#使$c引用$a的val,并使此zval.refcount加1
xdebug_debug_zval('a');
xdebug_debug_zval('c');
echo "4--",memory_get_usage(),"\n";
输出:
4--392136
a: (refcount=2, is_ref=1)=''
c: (refcount=2, is_ref=1)=''
4--392184
echo "\n";
echo "5--",memory_get_usage(),"\n";
unset($c);#断开$c到zval的引用,并使zval.refcount-1,然后如果zval.refcount==0,直接清除zval释放内存
xdebug_debug_zval('a');
xdebug_debug_zval('c');
echo "5--",memory_get_usage(),"\n";
输出:
5--392184
a: (refcount=1, is_ref=0)=''
5--392136
echo "\n";
echo "6--",memory_get_usage(),"\n";
$a=null;#zval还是存在的只是清除了,数据类型占用的空间,如:这里只减了16b,上面首次分配16b
xdebug_debug_zval('a');
xdebug_debug_zval('b');
echo "6--",memory_get_usage(),"\n";
输出:
6--392136
a: (refcount=1, is_ref=0)=NULL
b: (refcount=1, is_ref=0)='11111111'
6--392120
这篇关于通过代码看懂php内存分配机制,以及 unset 和 对内存的影响的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!