46 votes

Coût de l'utilisation des références faibles en Java

Quelqu'un a-t-il fait des recherches sur les coûts d'exécution liés à la création et au ramassage des déchets de Java ? Référence faible des objets ? Y a-t-il des problèmes de performance (par exemple, la contention) pour les applications multithreads ?

EDIT : Il est évident que la ou les réponses réelles dépendront de la JVM, mais les observations générales sont également les bienvenues.

EDIT 2 : Si quelqu'un a fait une analyse comparative des performances, ou peut indiquer des résultats d'analyse comparative, ce serait idéal. (Désolé, mais la prime a expiré ...)

13voto

Vitaly Points 633

Les WeakReferences ont un impact négatif sur le garbage collector du CMS. D'après ce que je peux voir du comportement de notre serveur, cela influence le temps de la phase de remarque parallèle. Pendant cette phase, tous les threads de l'application sont arrêtés, ce qui est extrêmement indésirable. Il faut donc être prudent avec les WeakReferences.

3voto

mantrid Points 1923

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X