Проблемы с памятью в PHP (5) - PullRequest
0 голосов
/ 28 июля 2010

Освобождает ли вызов unset() память, связанную с этим объектом?Есть пара случаев, когда я работаю с большими ассоциативными массивами, и я хотел бы удалить их по окончании (освобождая память для создания новых).

Ответы [ 6 ]

7 голосов
/ 28 июля 2010

Вызывает ли unset () освобождение памяти что было связано с этим объектом?

Да, это так.

Проверьте себя, используя memory_get_usage():

echo memory_get_usage() . "<br />";
unset($array['key']);
unset($array['key2']);
unset($array['key3']);
echo memory_get_usage();

Дополнительные ресурсы:

Цитата из более поздней ссылки:

PHP выполняет сборку мусора на три основных узла:

  1. Когда вы говорите это
  2. при выходе из функции
  3. Когда сценарий заканчивается

Ситуация 1 возникает при использовании unset () , mysql_free_result () или другие разрушающие ресурсы функции, которые четко прояснить после вашего переменные. Ситуация 2 проясняется ресурсы неявно - любая переменная который покидает сферу, то есть больше не применимо, выясняется для вас. Наконец, ситуация 3 освобождает все ресурсы, связанные со сценариями, неявно.

4 голосов
/ 28 июля 2010

unset() освобождает память в php, но позволяет сборщику мусора решить, когда на самом деле освободить указанную память. Таким образом, память освобождается по мере необходимости или по мере необходимости (до того, как PHP исчерпает доступную память).

Главное предостережение - следить за тем, чтобы вы не пытались unset() глобальные переменные в локальной области видимости. Даже переменные, переданные по ссылке, будут иметь свои локальные ссылки unset только тогда, когда это выполняется в локали функции. Чтобы действительно сделать память доступной, любой unset() должен быть сделан в соответствующей области видимости этой переменной.

2 голосов
/ 28 июля 2010

Нет, это не обязательно ничего бесплатно. Это просто уменьшает количество ссылок.

Пример:

//object has reference count 1 because it has one variable referencing 1
$a = new BigObject;
//object still has reference count 2, but no new object was allocated in memory
$b = $a;
//object has reference count 1
unset($a);
//the object is still in memory

Угол Nitpick: технически, здесь есть два подсчета ссылок - объект и zval. Количество ссылок объекта всего 1 во всей программе, это фактически число ссылок zval, которое изменилось в присваивании и при вызове unset.

2 голосов
/ 28 июля 2010

Удаляя переменную, вы устанавливаете ее «refcount» в 0. Это позволяет Zend Engine перемещать объекты в памяти, и он знает, что может перезаписать область ваших переменных в памяти, так как она имеет refcount 0.

Это происходит до того, как о сборке мусора даже не думают.Итак, у вас есть это, unset () действительно помогает вам в течение жизненного цикла вашего приложения.

2 голосов
/ 28 июля 2010

Он не освобождает память сразу, но позволяет сборщику мусора сделать это.

1 голос
/ 28 июля 2010

В PHP> 5.3.0 функция gc_collect_cycles () принудительно собирает любые существующие циклы мусора.

...