Necesito almacenar en caché los objetos en Java usando una proporción de la memoria RAM disponible. Soy consciente de que otros han hecho esta pregunta, pero ninguna de las respuestas cumple mis requisitos.¿Cómo guardo los objetos en Java de forma eficiente utilizando la memoria RAM disponible?
Mis requisitos son:
- simple y ligero
- No es dramáticamente más lento que un HashMap llanura
- Uso LRU, o alguna política de eliminación que se aproxima LRU
Probé LinkedHashMap, sin embargo, requiere que especifique una cantidad máxima de elementos, y no sé cuántos elementos se necesitarán para llenar la RAM disponible (sus tamaños variarán significativamente).
Mi enfoque actual es el uso de Map Maker de Google Colección de la siguiente manera:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Esto parecía atractivo, ya que se debe eliminar automáticamente los elementos cuando se necesita más memoria RAM, sin embargo hay un grave problema: su comportamiento es llenar toda la memoria RAM disponible, momento en el que el GC comienza a temblar y el rendimiento de la aplicación se deteriora drásticamente.
He oído hablar de cosas como EHCache, pero parece bastante pesado para lo que necesito, y no estoy seguro de si es lo suficientemente rápido para mi aplicación (recordando que la solución no puede ser mucho más lenta) que un HashMap).
¿qué tipo de objetos está almacenando en caché? No estoy del todo claro por qué le preocupa el rendimiento de la memoria caché, ya que tan pronto como esté tras una política de caducidad, va a incurrir en más sobrecarga que un mapa simple y EHCache es una lib de caché bien desarrollada, que (Estoy pensando en configurarlo a través de Spring aquí) no es complejo de configurar y tan fácil de usar que un mapa. – beny23
Los objetos varían en tamaño desde aproximadamente 1 kb hasta quizás 10 kbs. Me preocupa el rendimiento porque recuperar objetos de la memoria caché se encuentra en el ciclo interno de un proceso muy intensivo de la CPU. Si es lento, puede aumentar el tiempo requerido para que mi aplicación haga su trabajo de minutos a horas. – sanity
Con softKeys() no obtendrá un golpe si usa igual(), solo obtendrá un golpe si está buscando el objeto con igualdad de referencia. Si necesita equals() para hits de caché, use softValues () en su lugar. –