Предположим, что у меня есть слабая ссылка на автомобиль, который имеет обычную (сильную) ссылку на механизм. Никакие другие ссылки на автомобиль или механизм не существуют. Механизм может быть собран "мусор"?
Да, может, именно так слабые ссылки созданы для работы. Слабая ссылка - это корень, который ваш объект имеет к приложению, даже если объект может иметь другие сильные ссылки, важна ссылка на корень , и поскольку корневая ссылка является слабой ссылкой, объект будет кандидат на сборку мусора.
Для получения дополнительной информации см. Документацию по классу WeakReference
:
Слабые ссылочные объекты, которые не препятствуют сделать их референты финализируемыми, финализируемыми, а затем востребовано. Слабые ссылки чаще всего используются для реализации канонических отображений.
Предположим, что сборщик мусора определяет в определенный момент времени , что объект является слабодоступным. В это время он атомарно очистит все слабые ссылки на этот объект и все слабые ссылки на любые другие слабодоступные объекты, из которых {{1} } этот объект доступен через цепочку сильных и мягких ссылок. В то же время он объявит все ранее слабодоступные объекты финализируемыми. В то же время или через некоторое время он поставит в очередь те недавно очищенные слабые ссылки, которые зарегистрированы в очередях ссылок.
К вашему сведению, наряду с WeakReference
, Java предлагает два других подкласса Reference
: SoftReference
и PhantomReference
.
Вот модульный тест, демонстрирующий слабые ссылки. Обратите внимание, что 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());
}
}
Экземпляр Car может быть сборщиком мусора, но нет гарантии, что он будет сборщиком мусора на следующий цикл GC, или даже то, что он будет вообще собран. Например,
За некоторое время до запуска GC приложение могло вызвать get
в WeakReference
и сохранить ссылку на Car
в (для пример) атрибут некоторого достижимого объекта. После этого экземпляр Car
становится полностью доступным и больше не подлежит сборке мусора.
Если GC работает с Car
в описанном состоянии, спецификация JVM не гарантирует, что слабодоступный объект будет обнаружен в следующем цикле GC. Например, если данный цикл GC собирает только последнее поколение (а Car
был повышен до более старого поколения), GC не будет определять, что он является слабодоступным.
Даже когда сборщик мусора прерывает ссылку на Car
в WeakReference, экземпляр Car
не восстанавливается немедленно. Скорее всего, восстановление теперь недоступного автомобиля
, вероятно, произойдет (после возможной доработки) в более позднем цикле сборки мусора.