Estoy implementando un caché de imagen que puede ser pesado en el uso de la memoria, por lo que mantengo una SoftReference a los datos de la imagen para que el GC pueda recopilarlos bajo la presión de la memoria.
Sin embargo, cada entrada tiene una edad, entonces, ¿hay alguna manera de decirle a un GC (¿cuál?) que recopile entradas más antiguas en lugar de las "aleatorias"?
Supongo que podría hacerlo yo mismo manteniendo referencias sólidas y eliminando entradas en low freeMemory() , pero eso es una especie de "liberación indirecta" (GC todavía tiene que activarse para liberar la memoria).
De los documentos:
Se garantiza que todas las referencias suaves a objetos accesibles suavemente se hayan borrado antes de que la máquina virtual arroje un OutOfMemoryError. De lo contrario, no se imponen restricciones sobre el momento en que se borrará una referencia flexible o el orden en que se borrará un conjunto de tales referencias a diferentes objetos. Sin embargo, se recomienda que las implementaciones de máquinas virtuales sesguen en contra de borrar las referencias blandas creadas recientemente o utilizadas recientemente.
Por lo tanto, un caché sofisticado puede, por ejemplo, evitar que las entradas usadas más recientemente se descarten manteniendo fuertes referencias a esas entradas, dejando que las entradas restantes se descarten a discreción del recolector de basura.
Esto es de los documentos Java de JDK 11. En resumen, la respuesta es no. Supongo que podrías intentar hacer cosas locas con finalize , pero recomendaría no hacerlo. Su idea de usar referencias sólidas podría ser la más viable.