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

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

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

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

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

17
задан Dave L. 29 March 2012 в 19:47
поделиться