Ява - Круглая сборка мусора - PullRequest
1 голос
/ 10 мая 2010

A <-> B <-> C <-> D <-> A ...

// A это firstNode, D это lastNode

        if ( length == 1 )
        {
            firstNode = null;
            lastNode = null;

            firstNode.next = null;
            firstNode.prev = null;
        }

        else
        {
            Node secondNode = firstNode.next;
            Node secondToLast = lastNode.prev;

            firstNode.next = null;
            firstNode.prev = null;

            lastNode.next = null;
            lastNode.prev = null;

            secondNode.prev = null;
            secondToLast.next = null;

            firstNode = null;
            lastNode = null;
        }

Надеюсь, что все должно быть посередине в качестве кандидатов на сборку мусора?

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

Пока нет строгих ссылок , которые ссылаются на узлы, тогда не имеет значения, существуют ли циклические ссылки "между" узлами, объекты все равно будут кандидатами на сборку мусора.

Это означает, что когда больше нет локальных переменных или статических переменных, которые содержат ссылку на объекты (независимо от того, выпадают ли они из области видимости, вы явно устанавливаете их на null или назначаете их чему-то другому), тогда объект мусор собрал.

2 голосов
/ 10 мая 2010

Java не подсчитывает ссылки, поэтому не имеет значения, круглые ли ссылки.

Java использует algorthim типа метки и развертки при более высоких плотностях памяти и копию algorthim при более низких плотностях в версиях JVM 1.4, 1.5 и 1.6. Метка и развертка начинают помечать все «достижимые» из основного потока программы, а также очищает и сжимает все, что не было отмечено. Копирование и очистка копирует все объекты, доступные для основного потока, в новую память, а затем очищает старые блоки памяти.

Поскольку оба эти метода являются "достижимыми из основного потока", не имеет значения, если вы сделаете несколько циклических ссылок. Если ссылки «доступны из основного потока», тогда весь круг будет помечен и сохранен. Если циклическая ссылка недоступна для основного потока, она в конечном итоге будет очищена, поскольку она не помечена как используемая.

Java оптимизирует сборку мусора из поколения в поколение. Для более подробной информации смотрите здесь .

Java 1.7 может иметь новую стратегию сборки мусора по умолчанию. Он называется G1, что сокращенно от Garbage First. Они играли с ним в ветке 1.6, и вы можете включить его, если хотите. Это намного быстрее, чем стандартная сборка мусора, но неясно, будет ли она без ошибок или останется быстрее во всех важных случаях использования. Для получения дополнительной информации читайте о Garbage First

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...