Como as SoftReferences são coletadas pelas JVMs na prática?

Tenho dois caches separados em execução em uma JVM (um controlado por uma biblioteca de terceiros), cada um usando referências suaves. Eu preferiria que a JVM limpe meu cache controlado antes daquele controlado pela biblioteca. O javadoc do SoftReference declara:

Todas as referências suaves a objetos de alcance suave são garantidas como limpas antes da máquina virtual lançar um OutOfMemoryError. Caso contrário, nenhuma restrição será colocada no momento em que uma referência suave será limpa ou na ordem em que um conjunto dessas referências a diferentes objetos será limpo. As implementações de máquinas virtuais, no entanto, são incentivadas a impedir a limpeza de referências programáveis criadas ou usadas recentement

nstâncias @Direct desta classe podem ser usadas para implementar caches simples; essa classe ou subclasses derivadas também podem ser usadas em estruturas de dados maiores para implementar caches mais sofisticados. Enquanto o referente de uma referência suave estiver fortemente acessível, ou seja, estiver realmente em uso, a referência suave não será limpa. Assim, um cache sofisticado pode, por exemplo, impedir que as entradas usadas mais recentemente sejam descartadas mantendo referências fortes a essas entradas, deixando as entradas restantes a serem descartadas a critério do coletor de lix

Como as implementações comuns da JVM, especialmente o HotSpot, lidam com as SoftReferences na prática? Eles "enviesam-se contra a exclusão de referências flexíveis criadas recentemente ou usadas recentemente", conforme incentivado pela especificação?

questionAnswers(10)

yourAnswerToTheQuestion