亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

關(guān)於 PHP 記憶體管理的一個(gè)問題
給我你的懷抱
給我你的懷抱 2017-05-16 13:11:22
0
2
541

寫了個(gè)檔案測試 PHP 對(duì)記憶體的佔(zhàn)用,發(fā)現(xiàn)變數(shù)是數(shù)組和是對(duì)象,釋放後佔(zhàn)用的記憶體有區(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

對(duì)象:

<?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
給我你的懷抱
給我你的懷抱

全部回覆(2)
世界只因有你

這個(gè)問題很複雜,是關(guān)於 PHP 的垃圾回收機(jī)制,我也了解的不是很透徹,給你分享我了解的部分。
每個(gè)PHP程序會(huì)分配一個(gè)根緩衝區(qū),執(zhí)行過程中每次對(duì)PHP資料結(jié)構(gòu)體的引用都會(huì)被放入這個(gè)緩衝區(qū),一旦達(dá)到緩衝區(qū)的上限(一般為1萬),就會(huì)觸發(fā)PHP的垃圾回收機(jī)制,清理一些無效的資源。
如果你把循環(huán)的次數(shù)改為5000次,就不會(huì)觸發(fā)垃圾回收,後兩次的內(nèi)存值應(yīng)該是一樣的,可以試試看。

過去多啦不再A夢

看過一篇文章希望有幫助

垃圾回收

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板