L'utilisation de références faibles dans le cache peut ralentir considérablement votre application si elle est reconstruite à la demande, par exemple dans les getters :
public Object getSomethingExpensiveToFind() {
if(cache.contains(EXPENSIVE_OBJ_KEY)) {
return cache.get(EXPENSIVE_OBJ_KEY);
}
Object sth = obtainSomethingExpensiveToFind(); // computationally expensive
cache.put(EXPENSIVE_OBJ_KEY, sth);
return sth;
}
Imaginez ce scénario :
1) L'application manque de mémoire
2) Le GC nettoie les références faibles, donc le cache est aussi nettoyé.
3) L'application continue, beaucoup de méthodes comme getSomethingExpensiveToFind() sont invoquées et reconstruisent le cache.
4) L'application manque à nouveau de mémoire
5) GC nettoie les références d'usure, vide le cache
6) L'application continue, de nombreuses méthodes comme getSomethingExpensiveToFind() sont invoquées et le cache est reconstruit à nouveau.
7) et ainsi de suite...
J'ai rencontré un tel problème : l'application était très souvent interrompue par le GC, ce qui allait à l'encontre du but recherché par la mise en cache.
En d'autres termes, si elles sont mal gérées, les références faibles peuvent ralentir votre application.