Сильные ссылки
Это ваши обычные ссылки на объекты, которые мы кодируем ежедневно:
Employee emp = new Employee();
Переменная «emp» содержит строгую ссылку на объект Employee и объекты, которые доступны черезлюбая цепочка сильных ссылок не подходит для сбора мусора.Обычно это то, что вы хотите, но не всегда.Теперь предположим, что мы выбираем большое количество сотрудников из базы данных в коллекции или на карте, и нам нужно регулярно обрабатывать их, поэтому, чтобы сохранить производительность, мы будем держать их в кэше.
Что касаетсяэто хорошо, но теперь нам нужны разные данные, и нам не нужны эти объекты Employee, и на них нет ссылок нигде, кроме кеша.Что вызывает утечку памяти, потому что эти объекты не используются, но все еще не подходят для сборки мусора, и мы не можем удалить эти объекты из кэша, потому что у нас нет ссылки на них?Так что здесь либо нам нужно очистить весь кэш вручную, что утомительно, либо мы могли бы использовать ссылки другого типа, например, Weak References.
Weak References
Слабая ссылка не закрепляет объект в памяти ибудет GC'd в следующем цикле GC, если нет ссылок из других ссылок.Мы можем использовать класс WeakReference, предоставляемый Java, для создания кэшей указанного выше типа, которые не будут хранить объекты, на которые нет ссылок откуда-либо еще.
WeakReference<Cache> cache = new WeakReference<Cache>(data);
Для доступа к данным вам необходимо вызвать cache.get ().Этот вызов get может вернуть null, если слабая ссылка была собрана сборщиком мусора: необходимо проверить возвращаемое значение, чтобы избежать NPE.Java предоставляет коллекции, которые используют слабые ссылки, например, класс WeakHashMap хранит ключи (не значения) в качестве слабых ссылок.Если ключ имеет значение GC, значение также будет автоматически удалено с карты.
Поскольку слабые ссылки также являются объектами, нам необходим способ их очистки (они больше не нужны, когда объект онибыли ссылки были GC'd).Если вы передадите ReferenceQueue в конструктор для слабой ссылки, сборщик мусора добавит эту слабую ссылку к ReferenceQueue до того, как они будут завершены или GC'd.Вы можете периодически обрабатывать эту очередь и обрабатывать мертвые ссылки.
Мягкие ссылки
Мягкая ссылка похожа на слабую ссылку, но она с меньшей вероятностью будет собирать мусор.Мягкие ссылки очищаются по усмотрению сборщика мусора в ответ на запрос памяти.Виртуальная машина гарантирует, что все мягкие ссылки на мягко достижимые объекты будут очищены до того, как она выдаст OutOfMemoryError.
Фантомные ссылки
Фантомные ссылки являются самым слабым из всех ссылочных типов, вызывая getна них всегда будет возвращаться ноль.На объект ссылаются фантомно после того, как он был завершен, но до того, как его выделенная память была освобождена, в отличие от слабых ссылок, которые ставятся в очередь до того, как они завершены, или ссылки фантома GC'd редко используются.
Итакчем они полезны?Когда вы создаете фантомную ссылку, вы всегда должны передавать ReferenceQueue.Это означает, что вы можете использовать фантомную ссылку, чтобы увидеть, когда ваш объект GC'd.
Эй, так что, если слабые ссылки ставятся в очередь, когда они считаются финализированными, но еще не GC'd, мы могли бы создать новыйсильная ссылка на объект в блоке финализатора и предотвращение объекта GC'd.Да, вы можете, но вы, вероятно, не должны этого делать.Для проверки этого случая цикл GC будет происходить как минимум дважды для каждого объекта, если только этот объект не доступен только по фантомной ссылке.Вот почему вы можете исчерпать кучу, даже если ваша память содержит много мусора.Фантомные ссылки могут предотвратить это.
Вы можете прочитать больше в моей статье Типы ссылок в Java (Сильные, Мягкие, Слабые, Фантомные) .