Comment puis-je efficacement en cache les objets en Java à l'aide de la RAM disponible?

J'ai besoin de cache d'objets en Java en utilisant une proportion de ce que la RAM est disponible. Je suis conscient que d'autres ont posé cette question, mais aucune des réponses répondre à mes exigences.

Mes besoins sont:

  • Simple et léger
  • Pas considérablement plus lent qu'un simple HashMap
  • Utilisation LRU, ou de certains de la politique de suppression qui se rapproche de la LRU

J'ai essayé LinkedHashMap, cependant il vous demande de spécifier un nombre maximum d'éléments, et je ne sais pas combien d'éléments qu'il faudra pour remplir la RAM disponible (leurs tailles varient de façon significative).

Mon approche actuelle est d'utiliser Google Collecte du Cartographe comme suit:

Map<String, Object> cache = new MapMaker().softKeys().makeMap();

Cela semble attrayant comme il se doit supprimer automatiquement les éléments lorsqu'il a besoin de plus de RAM, il y a cependant un problème de taille: son comportement est de remplir toute la mémoire disponible, à quel point le GC commence à le thrash et l'ensemble de l'application du rendement se détériore considérablement.

J'ai entendu des trucs comme EHCache, mais il semble assez lourd pour ce dont j'ai besoin, et je ne suis pas sûr si il est assez rapide pour mon application (en se souvenant que la solution ne peut pas être considérablement plus lent que d'une table de hachage).

  • quels types d'objets sont vous la mise en cache? Je ne suis pas tout à fait pourquoi vous êtes inquiet au sujet de la performance de la mémoire cache, en considérant que dès que vous êtes à l'expiration de la politique, vous allez engager plus de ressources qu'une simple Carte et EHCache est bien développé de la mise en cache lib, qui (je pense configuré à l'aide de Printemps ici) n'est pas complexe et tout aussi simple à utiliser qu'une carte.
  • Les objets varient en taille de 1 à peut-être 10kbs. Je suis inquiet au sujet de la performance en raison de la récupération d'objets dans le cache est dans la boucle interne de beaucoup de temps CPU du processus. Si il est lent, il peut augmenter le temps nécessaire pour que mon appli pour faire sa chose à partir de quelques minutes à quelques heures.
  • Avec les touches() vous n'obtiendrez pas un hit si vous utilisez equals(), vous obtiendrez seulement un coup si vous êtes à la recherche de l'objet avec référence à l'égalité. Si vous avez besoin d'equals() pour le cache, puis utilisez softValues() à la place.
  • Double Possible de Facile, simple à utiliser LRU cache en java
InformationsquelleAutor sanity | 2010-01-28