簡體   English   中英

php內存釋放如何取決於硬件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM