關於 PHP 記憶體管理的一個問題
给我你的怀抱
给我你的怀抱 2017-05-16 13:11:22
0
2
404

寫了個檔案測試 PHP 對記憶體的佔用,發現變數是數組和是對象,釋放後佔用的記憶體有區別,想問一下是為什麼,下面是程式碼,運行在 PHP 7.0 CLI 模式下。

數組:

<?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
给我你的怀抱
给我你的怀抱

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

這個問題很複雜,是關於 PHP 的垃圾回收機制,我也了解的不是很透徹,給你分享我了解的部分。
每個PHP程序會分配一個根緩衝區,執行過程中每次對PHP資料結構體的引用都會被放入這個緩衝區,一旦達到緩衝區的上限(一般為1萬),就會觸發PHP的垃圾回收機制,清理一些無效的資源。
如果你把循環的次數改為5000次,就不會觸發垃圾回收,後兩次的內存值應該是一樣的,可以試試看。

过去多啦不再A梦

看過一篇文章希望有幫助

垃圾回收

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!