Будет ли GC собирать объект, на который ссылаются SoftReference и WeakReference?

У меня есть кэш, построенный из карты в SoftReferences. Когда они добавляются, они помещаются в другую очередь, чтобы лениво сжиматься с помощью gzip или чего-то подобного. Моя идея заключается в следующем: я хочу иметь WeakReferences для объектов в очереди сжатия, чтобы когда задача компрессора доходила до объекта, если она уже ушла, нам не нужно было сжимать его, а также чтобы очередь компрессора не сохранить объекты, которые в противном случае были бы GC'd.

Итак, если существует ровно одна SoftReference и одна WeakReference, применяется ли семантика SoftReference по-прежнему?

3 ответа

Решение

Да, семантика SoftReferences по-прежнему применяется: SoftReferences сильнее, чем WeakReferences.

Слабые ссылки в основном рассматриваются как несуществующие для GC. Таким образом, объект, который является только слабо достижимым, может быть немедленно GCed. Объекты, достижимые только SoftReferences как самый сильный тип, однако, рассматриваются только для GCing, если требования к памяти должны быть выполнены полностью.

Поэтому, если есть как мягкие, так и слабые ссылки, применяется семантика SoftReference.

Слабые ссылочные объекты, которые не мешают делать их референты финализируемыми, финализированными и затем возвращаемыми.

http://download.oracle.com/javase/6/docs/api/java/lang/ref/WeakReference.html

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

http://download.oracle.com/javase/6/docs/api/java/lang/ref/SoftReference.html

Да, нет проблем для GC объекта, который имеет столько мягких / слабых ссылок, сколько вы хотите, пока у него не будет почти одной сильной ссылки.

Вы должны заметить, что Weak Reference всегда собирать раньше Soft Reference, А также Soft Reference часто используют для кеширования чего-либо.

Это означает: в то время ему больше не нужно выживать, но иногда в будущем может понадобиться снова, и Java больше не будет работать для создания экземпляра нового объекта.

Другие вопросы по тегам