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

Langage Java Discussion :

Que fait exactement la méthode System.gc()


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Points : 7
    Points
    7
    Par défaut Que fait exactement la méthode System.gc()
    J'aimerais savoir, quand on applique cette méthode dans la méthode principale, est ce que la machine supprime de la mémoire toutes les instances sans exception créées jusque là dans la mémoire?

    Ou bien est ce qu'elle analyse ce qui suit comme instructions dans la méthode main pour savoir quelles instances elle peut effacer en fonction de leur utilisation future ou non dans les instructions à venir?

    Mille mercis d'avance!

  2. #2
    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
    la méthode demande au gc de faire immédiatement son travail. Le travail dépend de l'implémentation du gc, mais en aucun cas il n'y aura suppression d'instance qui sont toujours accessible par le code.


    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ArrayList l = new ArrayList(); // 1
    Object o=new Object(); // 2
    l.add(o);
    System.gc(); //A
    l.add(new Object()) //3
    l=null;
    System.gc(); //B
    o=null;
    System.gc(); //C
    En A, ni 1 ni 2 ne peuvent être GC, car l et o sont toujours référencés
    En B, 1 peut être libéré, ainsi que 3 par voie de conséquence
    En Cn 1 2 et 3 peuvent être libéré.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Un tout grand merci pour cette réponse très claire!

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par tchize_ Voir le message
    la méthode demande au gc de faire immédiatement son travail. Le travail dépend de l'implémentation du gc,
    +1

    Et rien ne garantie le passage du GC (d'ailleurs avec la JVM de Sun on peut utiliser l'option -XX:+DisableExplicitGC pour ignorer tous les appels explicite au GC).


    Mais le point le plus important c'est qu'il ne faudrait jamais appeler System.gc() !
    Cela provoque généralement un appel à un cycle FullGC qui va traiter tous le heap pour nettoyer un maximum d'objet, ce qui peut être très couteux sur de grosses applications (serveur par exemple) alors que le gain ne sera pas forcément évident (le GC travaillant par petit cycle GC fait tout aussi bien son travail).
    Mais le pire c'est que comme l'appel à System.gc() ne garantie pas son exécution, cela peut changer les performance du tout ou rien si on en abuse (Voir ce vieux mais très intéressant sujet : Difference de performances Unix/Windows d'un programme?)

    De plus, en cas de mémoire insuffisante un FullGC sera généré avant de générer un OutOfMemory... Donc un appel explicite à System.gc() ne servirait à rien...

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Que fait exactement l’option « SO_LINGER » ?
    Par ram-0000 dans le forum Contribuez
    Réponses: 0
    Dernier message: 27/04/2013, 18h00
  2. Que fait exactement « SO_REUSEADDR » ?
    Par ram-0000 dans le forum Contribuez
    Réponses: 0
    Dernier message: 27/04/2013, 18h00
  3. Que fait exactement la bibliothéque dos.h ?
    Par abira dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 22/03/2009, 23h14
  4. Que fait exactement un developpeur PL/SQL?
    Par rvfranck dans le forum Emploi
    Réponses: 4
    Dernier message: 25/03/2008, 21h29
  5. Réponses: 0
    Dernier message: 10/08/2007, 17h30

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