寫了個(gè)文件測試 PHP 對內(nèi)存的占用,發(fā)現(xiàn)變量是數(shù)組和是對象,釋放后占用的內(nèi)存有區(qū)別,想問一下是為什么,下面是代碼,運(yùn)行在 PHP 7.0 CLI 模式下。
數(shù)組:
<?php
function convert($size){
$unit=array('b','kb','mb','gb','tb','pb');
echo @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i]."\n";
}
function a(){
$a = [];
for($i=0;$i<1000000;$i++){
$a[$i] = $i;
}
convert(memory_get_usage(true));
}
convert(memory_get_usage(true));
// 2M
a();
convert(memory_get_usage(true))
// 2M
輸出:
2M
34M
2M
對象:
<?php
function convert($size){
$unit=array('b','kb','mb','gb','tb','pb');
echo @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i]."\n";
}
function a(){
$a = new stdClass;
for($i=0;$i<1000000;$i++){
$a->$i = $i;
}
convert(memory_get_usage(true));
}
convert(memory_get_usage(true));
a();
convert(memory_get_usage(true))
輸出:
2M
68M
32M
這個(gè)問題很復(fù)雜,是關(guān)于 PHP 的垃圾回收機(jī)制,我也了解的不是很透徹,給你分享一下我了解的部分。
每個(gè)PHP進(jìn)程會(huì)分配一個(gè)根緩沖區(qū),執(zhí)行過程中每次對PHP數(shù)據(jù)結(jié)構(gòu)體的引用都會(huì)被放入這個(gè)緩沖區(qū),一旦達(dá)到緩沖區(qū)的上限(一般為1萬),就會(huì)觸發(fā)PHP的垃圾回收機(jī)制,清理一些無效的資源。
如果你把循環(huán)的次數(shù)改為5000次,就不會(huì)觸發(fā)垃圾回收,后兩次的內(nèi)存值應(yīng)該是一樣的,可以試一下。