亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

解析PHP中的unset究竟會不會釋放內存

2020-03-22 16:54:51
字體:
來源:轉載
供稿:網友
首先讓我們看一個例子
復制代碼 代碼如下:
var_dump(memory_get_usage());
$a = "laruence";
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());

輸出(在我的個人電腦上, 可能會因為系統,PHP版本,載入的擴展不同而不同):
int(90440)
int(90640)
int(90472注意到 90472-90440=32, 于是就有了各種的結論, 有的人說PHP的unset并不真正釋放內存, 有的說, PHP的unset只是在釋放大變量(大量字符串, 大數組)的時候才會真正free內存, 更有人說, 在PHP層面討論內存是沒有意義的.那么, 到底unset會不會釋放內存? 這32個字節跑哪里去了?
要回答這個問題, 我將從倆個方面入手:
這32個字節去哪里了

首先我們要打破一個思維: PHP不像C語言那樣, 只有你顯示的調用內存分配相關API才會有內存的分配.
也就是說, 在PHP中, 有很多我們看不到的內存分配過程.
比如對于:
復制代碼 代碼如下:
$a = "laruence";

隱式的內存分配點就有:
1. 為變量名分配內存, 存入符號表
2. 為變量值分配內

所以, 不能只看表象.
第二, 別懷疑,PHP的unset確實會釋放內存(當然, 還要結合引用和計數, 這部分的內容請參看我之前的文章深入理解PHP原理之變量分離/引用), 但這個釋放不是C編程意義上的釋放, 不是交回給OS.
對于PHP來說, 它自身提供了一套和C語言對內存分配相似的內存管理API,這些API和C的API意義對應, 在PHP內部都是通過這些API來管理內存的.當我們調用emalloc申請內存的時候, PHP并不是簡單的向OS要內存, 而是會像OS要一個大塊的內存, 然后把其中的一塊分配給申請者, 這樣當再有邏輯來申請內存的時候, 就不再需要向OS申請內存了, 避免了頻繁的系統調用.
比如如下的例子:
復制代碼 代碼如下: ?php
var_dump(memory_get_usage(TRUE)); //注意獲取的是real_size
$a = "laruence";
var_dump(memory_get_usage(TRUE));
unset($a);
var_dump(memory_get_usage(TRUE));

輸出:
int(262144)
int(262144)
int(262144也就是我們在定義變量$a的時候, PHP并沒有向系統申請新內存.同樣的, 在我們調用efree釋放內存的時候, PHP也不會把內存還給OS, 而會把這塊內存, 歸入自己維護的空閑內存列表. 而對于小塊內存來說, 更可能的是, 把它放到內存緩存列表中去(后記, 某些版本的PHP, 比如我驗證過的PHP5.2.4, 5.2.6, 5.2.8, 在調用get_memory_usage()的時候, 不會減去內存緩存列表中的可用內存塊大小, 導致看起來, unset以后內存不變).現在讓我來回答這32個字節跑哪里去了, 就向我剛才說的, 很多內存分配的過程不是顯式的, 看了下面的代碼你就明白了:
復制代碼 代碼如下:
?php
var_dump("I am www.phpstudy.net");
var_dump(memory_get_usage());
$a = "laruence";
var_dump(memory_get_usage());
unset($a);
var_dump(memory_get_usage());

輸出:
string(43) "I am www.phpstudy.net"
int(90808) //賦值前
int(90976)
int(90808) //是的, 內存正常釋放90808-90808 = 0, 正常了, 也就是說這32個字節是被輸出函數給占用了(嚴格來說, 是被輸出的Header占用了)

只增不減的數組
Hashtable是PHP的核心結構(了解Hashtable, 可以參看我之前的文章深入理解PHP之數組(遍歷順序)), 數組也是用她來表示的, 而符號表也是一種關聯數組, 對于如下代碼:
復制代碼 代碼如下:
var_dump("I am www.phpstudy.net");
var_dump(memory_get_usage());
$array = array_fill(1, 100, "laruence");
foreach ($array as $key = $html' target='_blank'>value) {
${$value . $key} = NULL;
}
var_dump(memory_get_usage());
foreach ($array as $key= $value) {
unset(${$value . $key});
}
var_dump(memory_get_usage());

我們定義了100個變量, 然后又按個Unset了他們, 來看看輸出:
string(43) "I am www.phpstudy.net"
int(93560)
int(118848)
int(104448Wow, 怎么少了這么多內存?
這是因為對于Hashtable來說, 定義它的時候, 不可能一次性分配足夠多的內存塊, 來保存未知個數的元素, 所以PHP會在初始化的時候, 只是分配一小部分內存塊給HashTable, 當不夠用的時候再RESIZE擴容,而Hashtable, 只能擴容, 不會減少, 對于上面的例子, 當我們存入100個變量的時候, 符號表不夠用了, 做了一次擴容, 而當我們依次unset掉這100個變量以后, 變量占用的內存是釋放了(118848 – 104448), 但是符號表并沒有縮小, 所以這些少的內存是被符號表本身占去了…現在, 你是不是對PHP的內存管理有了一個初步的認識了呢?PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久激情五月丁香伊人| 久久69精品久久久久久国产越南| 97人洗澡人人免费公开视频碰碰碰| 欧美日韩一区二区三区在线免费观看| 亚洲第一免费网站| 亚洲日韩欧美视频| 亚洲精品乱码久久久久久按摩观| 欧美成在线视频| 乱亲女秽乱长久久久| 丝袜美腿亚洲一区二区| 日韩欧美aⅴ综合网站发布| 日韩精品免费电影| 国产精品v日韩精品| 91精品久久久久久综合乱菊| 黑人与娇小精品av专区| 日韩在线中文字幕| 欧美影院成年免费版| 亚洲欧美国产日韩天堂区| 国产精品视频播放| 国产精品视频网址| 久久精品国产久精国产一老狼| 精品久久久香蕉免费精品视频| 91精品国产高清久久久久久久久| 亚洲精品中文字| 成人h片在线播放免费网站| 成人黄色片在线| 亚洲va欧美va国产综合久久| 美女少妇精品视频| 精品色蜜蜜精品视频在线观看| 日本一区二区在线播放| 日韩精品免费综合视频在线播放| 亚洲一区二区三区四区在线播放| 91久久精品国产91性色| 久久久久久久久91| 成人有码在线播放| 亚洲成人在线视频播放| 亚洲精品第一国产综合精品| 欧美极度另类性三渗透| 亚洲精品一区二区网址| 日韩精品免费电影| 综合久久五月天| 亚洲va码欧洲m码| 久久久噜噜噜久久久| 亚洲第一综合天堂另类专| 疯狂做受xxxx欧美肥白少妇| 一区二区三区精品99久久| www欧美日韩| 久久精品福利视频| 最新69国产成人精品视频免费| 日韩中文综合网| 国产精品久久久久久久久| 亚洲天堂男人的天堂| 日韩在线免费高清视频| 国产视频在线观看一区二区| 久久视频在线视频| 国产精品久久久久久久久久ktv| 国产在线一区二区三区| 日韩欧美精品中文字幕| 成人在线视频福利| 久久久久久久久久久亚洲| 久久99视频免费| 亚洲级视频在线观看免费1级| 亚洲福利在线播放| 97超级碰在线看视频免费在线看| 日韩中文视频免费在线观看| 最新国产精品亚洲| 日韩美女av在线免费观看| 亚洲大胆美女视频| 欧美在线一级视频| 九九热精品视频在线播放| 91视频免费在线| 亚洲国产成人久久综合一区| 欧美成人精品激情在线观看| 国产亚洲精品日韩| 国产精品扒开腿做爽爽爽的视频| 国产精品亚洲综合天堂夜夜| 亚洲欧美国产精品va在线观看| 国产男女猛烈无遮挡91| 国产高清视频一区三区| 日韩成人中文字幕在线观看| 欧美视频一二三| 亚洲国产美女久久久久| 日韩电影中文字幕在线观看| 国产日韩在线看片| 亚洲欧洲日产国产网站| 久久久精品网站| 一道本无吗dⅴd在线播放一区| 热99在线视频| 一区国产精品视频| 狠狠色噜噜狠狠狠狠97| 亚洲缚视频在线观看| 国产亚洲在线播放| 在线观看视频亚洲| 久久久久久九九九| 久久人人爽人人爽人人片av高清| 日韩电影中文字幕av| 欧美极品美女电影一区| 1769国内精品视频在线播放| 久久久久久高潮国产精品视| 欧美激情videos| 精品国产欧美成人夜夜嗨| 中文日韩电影网站| 中文字幕精品—区二区| 国产色综合天天综合网| 91免费精品国偷自产在线| 7777免费精品视频| 亚洲成年人在线| 国产精品久久久久久久久久| 国产精品视频白浆免费视频| 国产精品一香蕉国产线看观看| 狠狠久久亚洲欧美专区| 性色av一区二区三区免费| 国内精品国产三级国产在线专| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久久久aaaa九色| 92看片淫黄大片看国产片| 国产美女久久久| 欧美精品在线第一页| 日韩电影免费观看在线观看| 91九色综合久久| 91系列在线播放| 久久久国产精彩视频美女艺术照福利| 亚洲福利在线看| 91手机视频在线观看| 久久精品国产亚洲精品2020| 日韩高清a**址| 欧美激情亚洲综合一区| 欧美精品做受xxx性少妇| 成人国产精品一区二区| 亚洲精品免费网站| 日产精品久久久一区二区福利| 亚洲国产成人精品一区二区| 日本国产欧美一区二区三区| 欧美麻豆久久久久久中文| 一本色道久久综合亚洲精品小说| 国产精品国产福利国产秒拍| 米奇精品一区二区三区在线观看| 97色在线播放视频| 欧美电影在线观看高清| 911国产网站尤物在线观看| 日韩亚洲综合在线| 亚洲国产精品久久久久| 日韩毛片在线看| 国产一区二区三区高清在线观看| 国产精品aaa| 少妇精69xxtheporn| 日本免费一区二区三区视频观看| 4k岛国日韩精品**专区| 欧美激情日韩图片| 91精品久久久久久久久中文字幕| 色悠久久久久综合先锋影音下载| 久久久电影免费观看完整版| 国产久一一精品| 456亚洲影院| 国产香蕉97碰碰久久人人| 热99精品里视频精品| 久久久中文字幕| 亚洲欧美日韩在线一区| 亚洲欧美在线免费| 亚洲韩国青草视频| 日韩福利视频在线观看| 欧美另类精品xxxx孕妇| 一区二区三区日韩在线| 久热精品视频在线观看|