Ich muss Objekte in Java mit einem Anteil von was RAM verfügbar ist, zwischenspeichern. Mir ist bewusst, dass andere diese Frage gestellt haben, aber keine der Antworten entspricht meinen Anforderungen.Wie kann ich Objekte in Java mit dem verfügbaren RAM effizient zwischenspeichern?
Meine Anforderungen sind:
- Einfache und leichte
- nicht dramatisch langsamer als eine einfache HashMap
- Verwendung LRU, oder eine Löschrichtlinie, die LRU
I LinkedHashMap versuchte annähert, Allerdings müssen Sie eine maximale Anzahl von Elementen angeben, und ich weiß nicht, wie viele Elemente benötigt werden, um den verfügbaren Arbeitsspeicher zu füllen (ihre Größe variiert erheblich).
Mein aktueller Ansatz ist Google Collection MapMaker wie folgt zu verwenden:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Dies schien attraktiv, da sie automatisch Elemente löschen sollen, wenn es mehr RAM benötigt, aber es ist ein ernstes Problem: sein Verhalten zu füllen den gesamten verfügbaren Arbeitsspeicher auf, woraufhin der GC zu thrashen beginnt und sich die Leistung der ganzen App dramatisch verschlechtert.
Ich habe von Sachen wie EHCache gehört, aber es scheint ziemlich schwer für das, was ich brauche, und ich bin mir nicht sicher, ob es schnell genug für meine Anwendung ist (bedenkt, dass die Lösung nicht dramatisch langsamer sein kann) als eine HashMap).
welche Art von Objekten sind Sie Caching? Ich bin nicht ganz, warum Sie sich Sorgen über die Leistung des Caches machen, wenn Sie nach einer Ablaufrichtlinie denken, werden Sie mehr Overhead als eine einfache Karte und EHCache ist eine gut entwickelte Caching-Lib, die (I Ich denke hier über Spring konfiguriert) ist nicht kompliziert einzurichten und ebenso einfach zu bedienen wie eine Karte. – beny23
Die Objekte variieren in der Größe von etwa 1kb bis vielleicht 10kbs. Ich mache mir Sorgen um die Leistung, weil das Abrufen von Objekten aus dem Cache in der inneren Schleife eines sehr rechenintensiven Prozesses stattfindet. Wenn es langsam ist, kann es die Zeit, die für meine App benötigt wird, um von Minuten zu Stunden zu gehen, erhöhen. – sanity
Mit SoftKeys() erhalten Sie keinen Treffer, wenn Sie equals() verwenden, Sie erhalten nur einen Treffer, wenn Sie das Objekt mit Referenzgleichheit nachschlagen. Wenn Sie equals() für Cache-Treffer benötigen, verwenden Sie stattdessen softValues (). –