class A{}
echo memory_get_usage(), "\n";
$array = [];
for($i = 0; $i++ < 1000000;)
{
$array[] = new A();
}
echo memory_get_usage(), "\n";
unset($array);
echo memory_get_usage(), "\n";
Почему освобождается не вся память, если наполнить массив объектами, а потом удалить этот массив?
Вывод в косноли:
565560
82504608
8946000
Было 565 560, удалили переменную, и стало 8 946 000, разница очень большая. Почему так? И как удалить оставшееся, если gc включен, и gc_collect_cycles() не помогает.
unset не удаляются полностью, для их полного "удаления/очищения" нужно использовать присвоение к null (но могу ошибаться, ибо теорию толком не помню)UPD Если создание каждый раз нового объекта не критично, вы можете передавать экземпляр класса (как обычную переменную), тогда память освободится ВСЯ.
class A{}
$a = new A();
echo memory_get_usage(), "\n";
$array = [];
for($i = 0; $i++ < 1000000;)
{
$array[] = $a;
}
echo memory_get_usage(), "\n";
foreach($array as $arr){
$arr=null;
unset($arr);
}
unset($array);
echo memory_get_usage(), "\n";
//365944 36017608 365944
Нашел старую статью про объекты и память, можно почитать на досуге - https://habr.com/ru/company/mailru/blog/255237/
Продвижение своими сайтами как стратегия роста и независимости