@viig

Почему не освобождается память?

Есть такой код:
<?
class T_Class {
    private $a = null;

    public function __construct($a = null) {
        $this->a = $a;
    }

    public function __destruct() {
        unset($this->a);
    }
}

print 'Before: '.(memory_get_usage(1)/1024); echo "\n";
$a = [];
for ($i=0; $i<1000000; $i++)
    $a[] = new T_Class($i);

print 'After create: '.(memory_get_usage(1)/1024);echo "\n";

for($i=0; $i < count($a); $i++)
    unset($a[$i]);

unset($a);

print 'Remove: '.(memory_get_usage(1)/1024);echo "\n";

Результат его работы такой:
Before: 2048
After create: 100352
Remove: 65536


Почему не освобождается вся использованная память?
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Потому что в PHP освобождением памяти занимается сборщик мусора.
А unset просто помечает эту область памяти как его законную добычу.
Ответ написан
@rPman
Проведи больше экспериментов и поймешь что та память что не освобождается не накапливается, т.е. если повторно выделить память и очистить ее, то итоговое потребление не вырастет.

Мне кажется это часть памяти занята под индексы (увеличивая размер массива увиличивается и потребление но зависимость от количества записей а не от их размера) и переиспользуется в дальнейшем
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы