У меня есть два отдельных кэша, работающих в JVM (один контролируется третьей стороной), каждый из которых использует мягкие ссылки. Я бы предпочел, чтобы JVM очистил мой контролируемый кеш до того, который контролируется библиотекой. В javadoc SoftReference указано:
Все мягкие ссылки на объекты с мягким достижением гарантируют, что был очищен до того, как виртуальная машина выбрасывает OutOfMemoryError. В противном случае на время, когда мягкий ссылка будет очищена или порядок, в котором набор таких ссылки на разные объекты будут очищены. Виртуальная машина однако, внедрение поощряется к смещению против клиринга недавно созданные или недавно использованные мягкие ссылки.
Прямые экземпляры этого класса могут использоваться для реализации простых кешей; этот класс или производные подклассы также могут использоваться в больших данных структуры для внедрения более сложных кешей. Пока референт мягкой ссылки может быть достигнут, т.е. фактически используется, мягкая ссылка не будет очищена. Таким образом, сложный кэш может, например, предотвратить его последнее использование за исключением случаев, когда их отбрасывают, сохраняя сильные ссылки на эти записи, оставив остальные записи, которые будут отброшены на по усмотрению сборщика мусора.
Как обычные реализации JVM, особенно HotSpot, обрабатывают SoftReferences на практике? "Уклоняются ли они от устранения недавно созданных или недавно использованных мягких ссылок", как это рекомендовано спецификацией?