[英]How php memory releasing depends on hardware?
在PC上,PHP不會返回分配給curl通道的OS內存。
可以通過以下腳本進行檢查:
<?php
$rss_cmd = " ps -o rss= -p ".posix_getpid();
echo "start: ".exec($rss_cmd).PHP_EOL;
$chs=[];
for ($i=0; $i<50000; $i++) {
$chs[]=curl_init();
}
echo "after init channels: ".exec($rss_cmd).PHP_EOL;
foreach ($chs as $ch) {
curl_close($ch);
}
echo "after close channels: ".exec($rss_cmd).PHP_EOL;
$chs=null;
unset($chs);
echo "after unset channels: ".exec($rss_cmd).PHP_EOL;
gc_collect_cycles();
echo "after init gc: ".exec($rss_cmd).PHP_EOL;
輸出:
start: 25104
after init channels: 1191560
after close channels: 1193280
after unset channels: 1191236
after init gc: 1191236
如我們所見,在關閉curl通道后,仍然可以分配內存。
但是,當我在任何其他計算機上運行此腳本時,我會得到另一個結果:
start: 20060
after init channels: 1781244
after close channels: 69820
after unset channels: 67772
after init gc: 67772
造成這種差異的原因是什么?
PS我用幾個操作系統和PHP版本檢查它:ubuntu服務器16.04,ubuntu桌面16.04,ubuntu 17.10,Mac OS X,php 7.0,php 7.1,php 7.2,libcurl 7.55,libcurl 7.47
這與PHP無關,而與操作系統如何管理分配給應用程序的內存有關。
如果在每次echo
調用之后調用PHP的memory_get_usage()
,您將看到PHP的內存使用量正在下降(因此在內部釋放了資源)。
除非確實需要,否則內核不一定會立即收回先前為其他應用程序分配的內存。
即使已分配了程序free()
的內存,操作系統也可以選擇保留分配給程序的內存,以防以后分配更多的內存,在這種情況下,操作系統只會將其返回給以前的實際內存地址以供使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.