IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tests et Performance Java Discussion :

Tutoriel pour connaître les dangers d'utiliser System.gc()


Sujet :

Tests et Performance Java

  1. #1
    Rédacteur

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    Juillet 2005
    Messages
    14 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14 974
    Points : 73 024
    Points
    73 024
    Par défaut Tutoriel pour connaître les dangers d'utiliser System.gc()
    Bonjour,

    Antonio Gomes Rodrigues nous propose un tutoriel Java pour comprendre les dangers d'utiliser explicitement la méthode System.gc()

    L'URL de l'article est : http://arodrigues.developpez.com/tut...ter-system-gc/

    Profitez de cette discussion pour donner vos commentaires

    Mickael
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Ingénieur de Recherche en informatique au LIAS / ISAE-ENSMA
    Page de Developpez.com : mbaron.developpez.com
    Twitter : www.twitter.com/mickaelbaron
    Blog : mickael-baron.fr
    LinkedIn : www.linkedin.com/in/mickaelbaron
    DBLP : dblp.uni-trier.de/pers/hd/b/Baron:Micka=euml=l

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Il est dommage de ne pas avoir le détail sur l'instrumentation du bytecode.
    De même, il semble que le problème, soit l'appel d'une fonctionnalité gourmande (pour le coup le gc) en ressource lors du traitement d'un formulaire. (Ce qui n'est jamais une bonne idée.) Plus que l'appel du gc en lui même !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2002
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 360
    Points : 3 614
    Points
    3 614
    Par défaut
    Citation Envoyé par kolodz Voir le message
    Bonjour,

    Il est dommage de ne pas avoir le détail sur l'instrumentation du bytecode.
    Bonjour,
    J'ai utilisé byteman pour afhicher un message et récupérer la stackstrace

    Citation Envoyé par kolodz Voir le message
    De même, il semble que le problème, soit l'appel d'une fonctionnalité gourmande (pour le coup le gc) en ressource lors du traitement d'un formulaire. (Ce qui n'est jamais une bonne idée.) Plus que l'appel du gc en lui même !

    Cordialement,
    Patrick Kolodziejczyk.
    Je ne comprend pas bien votre raisonnement

    C'est l'appel du GC (avec system.gc()) qui pose problème comme on peut le voir en comparant les mesures avant/après.

    Antonio

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Citation Envoyé par ra77 Voir le message
    Je ne comprend pas bien votre raisonnement

    C'est l'appel du GC (avec system.gc()) qui pose problème comme on peut le voir en comparant les mesures avant/après.
    Oui, la comparaison des mesures avant/après montre une mauvaise utilisation de system.gc(). Cependant, ce n'est pas une mauvaise utilisation spécifique à cette méthode.

    En effet, dans la trace on constat bien qu'on se trouve directement dans un traitement d'une requête :
    Citation Envoyé par trace d'appel
    org.springframework.samples.petclinic.web.FindOwnersForm.processSubmit(FindOwnersForm.java:50)
    Or, c'est une erreur courant de placer un traitement "consommateur de ressource" dans un traitement front-end et que cela pose des problèmes de ralentissement. Car, il est impossible de prédire le nombre d'appel à traiter. Que cela soit, dans ce cas, system.gc() n'est qu'anecdotique.
    Personnellement, j'ai déjà à cette endroit l'appel à des traitements métiers type "batch" ou la mise à jour quasi-systématique d'un cache quelconque. Et au final le temps de réponse est celui de ce "gros traitement" qui n'a rien à faire là.

    Certains, c'est une mauvaise utilisation du GC. Mais, pour moi, c'est surtout le nom respect d'un principe de base d'un développement d'IHM.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il me semble tout à fait logic que le GC ne doit pas être appelé dans une boucle, par exemple dans un endroit ou la performance est critique. On peux essayer de gérer la création de ses instances, les réutiliser si possible, faire des pools. Mais rien n'empêche l'utilisation de cette méthode bien que cela doit-être utilisé dans des cas très spécifique, les jeux vidéo après certaines opérations coûteuse en mémoire éventuellement, ou après un traitement important ayant généré beaucoup d'objets devenu obsolètes depuis.


    Première mauvaise nouvelle, System.gc() ne réalise pas forcément un GC (il peut ne rien faire) et surtout on ne sait pas quand.

    Comme décrit dans la doc java, cela n'est en aucun cas une méthode utilisé pour lancer une passe du GC. C'est juste un "hint" pour le système, afin de lui indiquer qu'on aimerais bien qu'il passe le GC, et c'est pour cela qu'il ce peux que cette appelle n'appelle pas le GC, justement. Vous auriez pu le préciser dans votre article.


    "Nous avons vu dans cet article les méfaits de l'utilisation explicite de la méthode System.gc(). Mon conseil en guise de conclusion est de ne pas utiliser de System.gc()."

    C'est donc aussi simple que ça. Parce que dans UN programme on détecte un bottleneck lié au GC, pour ne pas prendre de risque, on utilise plus jamais System.gc().
    Dernière modification par Mickael Baron ; 19/11/2015 à 20h25.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2002
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 360
    Points : 3 614
    Points
    3 614
    Par défaut
    Citation Envoyé par romain1337 Voir le message
    Bonjour,

    Il me semble tout à fait logic que le GC ne doit pas être appelé dans une boucle, par exemple dans un endroit ou la performance est critique. On peux essayer de gérer la création de ses instances, les réutiliser si possible, faire des pools. Mais rien n'empêche l'utilisation de cette méthode bien que cela doit-être utilisé dans des cas très spécifique, les jeux vidéo après certaines opérations coûteuse en mémoire éventuellement, ou après un traitement important ayant généré beaucoup d'objets devenu obsolètes depuis.


    Première mauvaise nouvelle, System.gc() ne réalise pas forcément un GC (il peut ne rien faire) et surtout on ne sait pas quand.

    Comme décrit dans la doc java, cela n'est en aucun cas une méthode utilisé pour lancer une passe du GC. C'est juste un "hint" pour le système, afin de lui indiquer qu'on aimerais bien qu'il passe le GC, et c'est pour cela qu'il ce peux que cette appelle n'appelle pas le GC, justement. Vous auriez pu le préciser dans votre article.
    Comme vous pouvez le voir, la Javadoc est juste au dessus et dit exactement ce que vous dites. Moi de mon coté j'ai résumé avec la phrase que vous cité pour éviter de répéter mot pout mot ce qu'il y a juste au dessus dans la Javadoc


    Citation Envoyé par romain1337 Voir le message
    "Nous avons vu dans cet article les méfaits de l'utilisation explicite de la méthode System.gc(). Mon conseil en guise de conclusion est de ne pas utiliser de System.gc()."

    C'est donc aussi simple que ça. Parce que dans UN programme on détecte un bottleneck lié au GC, pour ne pas prendre de risque, on utilise plus jamais System.gc().
    Petite précisions (valable aussi pour kolodz), le but de l'article est de montrer qu'il est dangereux (ce que j'ai déjà vu dans des outils en production) d'utiliser un System.gc() et qu'il vaut mieux laisser faire la JVM pour la libération de la mémoire (ce qui n’empêche pas de la tuner).

    Pour cela j'ai utilisé une application démo appelé Spring PetClinic, puis j'ai crée un script JMeter pour réaliser de la charge. Puis j'ai modifié le code source pour ajouter System.gc() dans une des fonctions testé par notre script JMeter. Pour accentuer et bien montrer le problème, ce System.gc() est appelé dans une fonction souvent appelé.

    Donc (pour kolodz) je suis d'accord avec vous mais le but de l'article est de montrer qu'il ne faut pas utiliser System.gc(). Ce qui est fait.

    Pour romain1337, comme indiqué, le but de l'article est de ....Je me focalise sur un problème (que j'ai vue en prod et que donc certain développeurs pensent que cela est une bonne pratique et/ou n'a pas d'impact négatif) et je démontre avec des chiffres (je l'accorde que le test est la pour exagérer les résultats pour que le message soit percutant) ce que je préconise.

    Pour info, JClarity Censum (outils d'analyse de log GC) fait par des spécialistes (dont Kirk Pepperdine) préconise la même chose

    Antonio

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Bon déjà je vais le garder sous le coude pour mettre leur nez dans le caca aux petits nouveaux qui font des appels à System.gc(). Par contre, je serais curieux de voir le même genre de test, mais sur une méthode qui consomme 30 à 40% de la mémoire disponible dans la JVM en objets de petite taille. Pour savoir si il y a des cas où ça donnerais du positif

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/10/2011, 08h25
  2. Option pour voir les variable non utilisées ?
    Par lex13 dans le forum NetBeans
    Réponses: 13
    Dernier message: 25/08/2007, 12h57
  3. API pour connaître les fonctionnalités existants dans un site web
    Par imedad dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 22/03/2007, 19h20
  4. Tutoriel pour modifier les en-têtes de chapitres ?
    Par Paenitentia dans le forum Mise en forme
    Réponses: 2
    Dernier message: 04/01/2007, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo