Как SoftReferences собираются JVM на практике?

У меня в JVM работает два отдельных кэша (один контролируется сторонней библиотекой), каждый из которых использует программные ссылки. Я бы предпочел, чтобы JVM очистил мой контролируемый кеш, прежде чем тот, который контролируется библиотекой. Javadoc SoftReference заявляет:

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

Прямые экземпляры этого класса могут использоваться для реализации простых кэшей; этот класс или производные подклассы также могут использоваться в больших структурах данных для реализации более сложных кэшей. Пока референт мягкой ссылки является сильно достижимым, то есть фактически используется, мягкая ссылка не будет очищена. Таким образом, сложный кэш может, например, предотвращать сброс последних использованных записей, сохраняя строгие ссылки на эти записи, оставляя оставшиеся записи на усмотрение сборщика мусора.

Как обычные реализации JVM, особенно HotSpot, обрабатывают SoftReferences на практике? Являются ли они «предвзятым отношением к удалению недавно созданных или недавно использованных мягких ссылок», как это поощряется спецификацией?

Ответы на вопрос(5)

Ваш ответ на вопрос