是否在PHP中的设置将释放内存
复制代码代码如下所示:
var_dump(memory_get_usage());
$ =laruence ;
var_dump(memory_get_usage());
unset(美元);
var_dump(memory_get_usage());
输出(在我的个人电脑上,它可能因系统不同,PHP版本,负载的扩展):
Int(90440)
Int(90640)
Int(90472
注意90472-90440 = 32,因此会有不同的结论,有人说PHP设置是不是真的可用内存,有的说,PHP将被释放(大量字符串变量,数组)时,只有自由的记忆,更多的人说,在记忆的PHP水平是没有意义的。
所以,是否取消将释放内存,32字节逃跑
要回答这个问题,我将从两个方面入手:
这32个字节在哪里
首先,我们想打破一个想法:PHP不象C语言,只有你显示的调用内存分配API会有内存分配。
换句话说,有很多的内存分配过程,我们在PHP中看不到。
例如:
复制代码代码如下所示:
$ =laruence ;
隐式内存分配点是:
1。为变量名分配内存并保存符号表
2。可变值分配
所以,你不能只看图像。
其次,不要怀疑,PHP的设置并释放内存。当然,你必须把引用和计数结合起来。请参考我以前的文章来理解PHP原理的分离和引用,但是这个版本并不是C编程的意思,而是没有交付给操作系统。
对于PHP,它本身提供了类似于C语言中的内存分配的内存管理API。这些API和C的API含义与PHP通过API的内部内存管理相对应。
我们调用emalloc内存的应用程序时,PHP并不是简单的内存操作系统,但想操作系统的内存块,然后把一块转让给申请人,所以当另一个逻辑存储器的应用,你不再需要向操作系统内存,系统调用频繁。
例子如下:
复制代码代码如下:< PHP
var_dump(memory_get_usage(真正的)); / /得到的关注是real_size
$ =laruence ;
var_dump(memory_get_usage(真的));
unset(美元);
var_dump(memory_get_usage(真的));
输出:
Int(262144)
Int(262144)
Int(262144
也就是说,当我们定义变量a时,PHP不向系统应用新的内存。
同样的,当我们释放内存调用饱和,PHP不会把内存还给操作系统,并将内存空闲内存列表维护。对于内存小,更可能的是,把它放在内存缓存列表(后记,一些版本的PHP,例如,我验证了php5.2.4,5.2.6,5.2.8,get_memory_usage)在调用(如果可用内存块的大小,不在列表中减去内存缓存照顾设置,内存不变)。
现在让我来回答32字节运行的位置,现在对我来说,许多内存分配过程不是显式的。
复制代码代码如下所示:
< PHP
var_dump(我);
var_dump(memory_get_usage());
$ =laruence ;
var_dump(memory_get_usage());
unset(美元);
var_dump(memory_get_usage());
输出:
字符串(43)我
Int(90808)在作业前
Int(90976)
Int(90808)是正常的内存释放。
90808-90808 = 0,正常,即32个字节被输出功能(严格来说,标题是取的输出)。
一个不灭的阵列
哈希表是PHP的核心结构。要了解Hashtable,你可以参考我之前的文章,了解PHP数组(遍历)。数组也由她表示,符号表也是一个关联数组。
复制代码代码如下所示:
var_dump(我);
var_dump(memory_get_usage());
array_fill($array = 1, 100,laruence );
foreach(数组键=美元美元值){
$ $值。$键= null;
}
var_dump(memory_get_usage());
foreach(数组键= >美元美元值){
撤消($ { $价值。$键});
}
var_dump(memory_get_usage());
我们定义了100个变量,然后我们要取消他们,看到的输出:
字符串(43)我
Int(93560)
Int(118848)
Int(104448
哇,内存少了多少
这是因为哈希表,定义它,可能不是块一次性分配不够,保存未知个数的元素,所以PHP会在初始化的时候,只有分配的内存块的哈希表的一小部分,当没有足够的调整展开,
哈希表,只有扩大,不会减少,对于上面的例子,当我们在100个变量,符号表是不够的,做一个扩展,我们将设置了100个变量,变量的内存释放(118848 - 104448),但符号表并没有减少,这样的内存量是符号表本身…
现在,您对PHP的内存管理有初步的了解了吗