Не освобождается память в PHP

105
26 января 2020, 05:40
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() не помогает.

Answer 1
  1. https://www.php.net/manual/ru/features.gc.performance-considerations.php - тут подробности
  2. Да, объекты простым 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/

READ ALSO
Как редактировать определенную строку?

Как редактировать определенную строку?

С помощью данного кода открываю файл для редактирования, но файл очень большой, и не удобно искать 1 строку для редактированияКак открыть...

116
Сортировка даты в Yii2

Сортировка даты в Yii2

Как можно отсортировать ActiveRecord по полю date, что бы отсортировать от самых близких датКак в этом запросе, но неподходящие записи выводить в конец...

113
Что работает быстрее? fgetcsv или (fgets + explode) или (fgets + str_getcsv)

Что работает быстрее? fgetcsv или (fgets + explode) или (fgets + str_getcsv)

Иногда в csv файле у описаний полей, и/или у данных, может быть 1 лишний разделитель (в нашем случае ;)

138
PHP вывод содержимое папки с аудио

PHP вывод содержимое папки с аудио

Не являюсь знатоком РНР, но появилась нужда кое-что делать\ asterisk под управлением freepbx записывает разговоры

91