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

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

Так что, если есть ровно одна SoftReference и одна WeakReference, применима ли по-прежнему семантика SoftReference?


person gub    schedule 03.10.2010    source источник
comment
ССЗ? Я думаю, вы просто имеете в виду GC, когда большинство людей видят GCC, они думают о коллекции компиляторов Gnu.   -  person mikerobi    schedule 04.10.2010
comment
ха-ха, я имею в виду это. Уже поздно; благодаря.   -  person gub    schedule 04.10.2010


Ответы (3)


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

WeakReferences в основном рассматриваются как несуществующие для GC. Таким образом, объект, который слабо достижим, может быть немедленно подвергнут сборке мусора. Однако объекты, доступные только 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

person Hendrik Brummermann    schedule 03.10.2010

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

person jutky    schedule 03.10.2010

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

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

person hqt    schedule 23.03.2012