Подсчет ссылок в php - как это работает?


Я пытаюсь понять эту статью " Руководство по PHP -> Функции -> Сборка мусора" к сожалению, для меня мало что неясно.

1.

Чтобы избежать необходимости вызывать проверку циклов мусора при каждом возможном уменьшении количества ссылок, алгоритм вместо этого помещает все возможные корни (zvals) в "корневой буфер".

Но что в случае

<?php
$a = new \stdClass(); (1)
$a = new \stdClass();

Тогда я предполагаю, что первым объектом станет "потерянный" звал как

No_symbol: (refcount=1, is_ref=1) = стандартный объект

Будут ли такие "потерянные" звалы добавлены в корневой буфер или нет? Для них нет обработчика.

2.

Переменные, созданные в области действия функции, что с ними произошло?
Пример:

<?php
function test($a = 'abc') {
    $c = 123;

    return 1; 
}

test(); 
echo 'end';

Что произошло с $a и $c при запуске gc? Для этих переменных по-прежнему установлено значение refcount равное 1. Будут ли они по-прежнему удалены? если да, то почему и как (что происходит под прикрытием?)

3. Как это может быть помощь в циклических ссылках?
Пример

<?php
$a = array('abc');
$a[] =& $a;
unset($a);

Где

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='abc',
   1 => (refcount=1, is_ref=1)=...
)
Author: mrok, 2014-02-02

1 answers

1) Исходный объект заменяется новым, и, таким образом, память мгновенно освобождается.

echo memory_get_usage().'<br/>';
$a = new stdClass();
echo memory_get_usage().'<br/>';
$a = new stdClass();
echo memory_get_usage().'<br/>';

2) Они обрабатываются в ту секунду, когда функция завершает выполнение:

echo memory_get_usage().'<br/>';
function test($a = 'abc') {
    $c = 123;

    return 1;
}
echo memory_get_usage().'<br/>';
test();
echo memory_get_usage().'<br/>';

3) при сбросе $a указанная переменная останется в памяти. Сначала вам нужно установить значение NULL, а затем отменить его.

echo memory_get_usage().'<br/>';
$a = array('abc');
echo memory_get_usage().'<br/>';
$a[] =& $a;
echo memory_get_usage().'<br/>';
$a = null;
unset($a);
echo memory_get_usage().'<br/>';
 1
Author: Kovo, 2014-02-10 21:27:55