слабая ссылка на объект, содержащий вложенную сильную ссылку и сборку "мусора"

Предположим, что у меня есть слабая ссылка на автомобиль, который имеет обычную (сильную) ссылку на механизм. Никакие другие ссылки на автомобиль или механизм не существуют. Механизм может быть собран "мусор"?

16
задан Basil Bourque 6 October 2017 в 21:22
поделиться

3 ответа

Да, может, именно так слабые ссылки созданы для работы. Слабая ссылка - это корень, который ваш объект имеет к приложению, даже если объект может иметь другие сильные ссылки, важна ссылка на корень , и поскольку корневая ссылка является слабой ссылкой, объект будет кандидат на сборку мусора.

Для получения дополнительной информации см. Документацию по классу WeakReference :

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

Предположим, что сборщик мусора определяет в определенный момент времени , что объект является слабодоступным. В это время он атомарно очистит все слабые ссылки на этот объект и все слабые ссылки на любые другие слабодоступные объекты, из которых {{1} } этот объект доступен через цепочку сильных и мягких ссылок. В то же время он объявит все ранее слабодоступные объекты финализируемыми. В то же время или через некоторое время он поставит в очередь те недавно очищенные слабые ссылки, которые зарегистрированы в очередях ссылок.

К вашему сведению, наряду с WeakReference , Java предлагает два других подкласса Reference : SoftReference и PhantomReference .

18
ответ дан 30 November 2019 в 21:19
поделиться

Вот модульный тест, демонстрирующий слабые ссылки. Обратите внимание, что System.gc () не гарантирует, что объект будет обработан сборщиком мусора, и вам не следует полагаться на него.

import junit.framework.TestCase;

import java.lang.ref.WeakReference;

public class WeakReferenceTest extends TestCase {


    class Car {

        Engine engine = new Engine();

    }

    class Engine {

    }

    public void testWeakReferences() {
        WeakReference<Car> carRef = new WeakReference<Car>(new Car());
        assertNotNull(carRef.get());
        System.gc();
        assertNull(carRef.get());
    }

}
1
ответ дан 30 November 2019 в 21:19
поделиться

Экземпляр Car может быть сборщиком мусора, но нет гарантии, что он будет сборщиком мусора на следующий цикл GC, или даже то, что он будет вообще собран. Например,

  • За некоторое время до запуска GC приложение могло вызвать get в WeakReference и сохранить ссылку на Car в (для пример) атрибут некоторого достижимого объекта. После этого экземпляр Car становится полностью доступным и больше не подлежит сборке мусора.

  • Если GC работает с Car в описанном состоянии, спецификация JVM не гарантирует, что слабодоступный объект будет обнаружен в следующем цикле GC. Например, если данный цикл GC собирает только последнее поколение (а Car был повышен до более старого поколения), GC не будет определять, что он является слабодоступным.

  • Даже когда сборщик мусора прерывает ссылку на Car в WeakReference, экземпляр Car не восстанавливается немедленно. Скорее всего, восстановление теперь недоступного автомобиля , вероятно, произойдет (после возможной доработки) в более позднем цикле сборки мусора.

8
ответ дан 30 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

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