PHP是如何管理記憶體的 這是提問帖

2022-02-07 21:04:44 字數 2221 閱讀 8756

除錯環境: xampp 1.8.1, windows 8 x64位作業系統, 記憶體8g.

php在每次呼叫執行時, 究竟占用了系統多少記憶體呢? 許多文章僅寫到了很少, 效能很高, 卻沒有細緻講解, 也沒有分析資料報告. 今天有個需求很特殊, 需要分析記憶體占用, 所以寫篇文章記錄一下, 掌握規律.

a:1

<?php

$amemory = memory_get_usage(); // 初始化: 0.141 kb

$var = '記憶體使用檢測';

echo sprintf('%01.2f',(memory_get_usage() - $amemory) / 1024) .' kb';

// out: 0.24 kb

?>

簡單地賦值了六個中文, 即增加了0.1kb記憶體. 變數記憶體越多, 所佔記憶體越大, 這個不可厚非的, 特別是宣告的無意義變數, 臨時變數, 也是會占用記憶體的. 經常檢測, 我們得出幾點結論:

注釋, 編輯器換行不占用記憶體.  你上一行與下一行就是換行1000次, 也不會增加半點記憶體.

a:2

<?php

$amemory = memory_get_usage(); // 初始化: 0.141 kb

file_get_contents('');

echo sprintf('%01.8f',(memory_get_usage() - $amemory) / 1024) .' kb';

out: 1.68kb

?>

雖然執行時間比較長, 但似乎占用記憶體不多, 僅1.68. 而qq.com的首頁肯定不只1kb, 那我們換成下面這樣.

<?php

$amemory = memory_get_usage(); // 初始化: 0.141 kb

$data = file_get_contents('');

echo sprintf('%01.8f',(memory_get_usage() - $amemory) / 1024) .' kb';

out: 337.99kb

?>

終於得出qq首頁的記憶體占用了, 可為什麼宣告乙個變數就會產生如此之大的變化呢? 那使用者平時在使用時, 是賦值給乙個變數還是直接操作?

賦值給變數是正常做法, 因為資料你可能會多次使用.  可賦值後, 記憶體卻占用如此之大, 何解.

我們繼續修改成函式:

<?php

$amemory = memory_get_usage(); // 初始化: 0.141 kb

gets(); //用函式來裝載.

function gets()

echo sprintf('%01.8f',(memory_get_usage() - $amemory) / 1024) .' kb';

out: 0.51kb

?>

簡直讓人驚呆, 這樣呼叫, 記憶體占用才0.5kb, 可事實上, 函式體內已經產生了300kb左右的資料了. 難道記憶體執行完後, 還會自動銷毀自身?

繼續修改:

<?php

$amemory = memory_get_usage(); // 初始化: 0.141 kb

$t = gets(); //用函式來裝載.

function gets()

echo sprintf('%01.8f',(memory_get_usage() - $amemory) / 1024) .' kb';

out: 0.82kb

?>

我們取出300個位元組返回, 然後用個$t變數賦值. 很正常的, 前台增加了0.3kb, 這演算法還算準確.

<?php

$amemory = memory_get_usage(); // 初始化: 0.141 kb

$data = file_get_contents('');

unset($data);

echo sprintf('%01.8f',(memory_get_usage() - $amemory) / 1024) .' kb';

out: 1.67kb

?>

最後, 我們試驗一下unset函式的神奇之處. 未使用unset函式時是337kb, 使用了unset之後, 記憶體占用是1.67kb,  結論是, unset函式還是有意義的, 大家要常用.

非常讓人不解的是, 為什麼函式及非賦值變數不產生記憶體占用.  朌望高人指點迷津.

Linux是如何管理記憶體的

物理記憶體的管理 linux管理物理記憶體是使用分頁機制實現的。為了使分頁機制在32位和64位體系結構下高效工作,linux採用了乙個四級分頁策略。linux支援多種記憶體分配機制。分配物理記憶體頁框的主要機制是頁面分配器,它使用了著名的夥伴演算法作為物理記憶體分配機制。管理一塊記憶體的基本思想如下...

Windows下的記憶體是如何管理的?

參考資料 1 有三種方法 虛擬記憶體,記憶體對映檔案,記憶體堆疊。虛擬記憶體是將頁檔案載入到記憶體,適用於比較大的物件或結構 記憶體對映檔案是將磁碟上檔案載入到記憶體,適用於大檔案和單機的程序間記憶體共享 堆疊就是動態的分配記憶體,適用於小物件的建立。這些在windows核心程式設計中都描述得很詳細...

記憶體管理那些事兒 指標引數是如何傳遞記憶體的

01.如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體void getmemory char p int main 執行上面的 則會出錯。編譯器總是要為函式的每個引數製作臨時副本,指標 引數p 的副本是 p,編譯器使 p p。如果函式體內的程式修改了 p 的內容,就導致引數p 的內容作相應...