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

Débats sur le développement - Le Best Of Discussion :

Pour ou Contre le Garbage Collector ?


Sujet :

Débats sur le développement - Le Best Of

  1. #121
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par adiGuba
    Ce est une situation simple : tu lui demandes de créer une nouvelle chaine à chaque itération et c'est ce qu'il fait.
    C'est typiquement une erreur de programmation qui surcharge le GC de travail...
    En C++ ce serait la même chose, il serait préfèrable d'utiliser un strstream pour pouvoir profiter d'un buffer.

  2. #122
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    ben moi je ne suis ni pour ni contre, bien au contraire

    sérieusement le garbage collector me semble vraiment adapté pour les applications J2EE. Ce genre d'application tourne souvent sur des machines multi-processeurs et justement le GC peut fonctionner en parallèle(ce qui diminue les temps de pause).

    De plus depuis j2se 5.0, le garbage collector adapte sa stratégie automatiquement au cours de l'exécution de l'appli. En gros il y a trois points qu'il tente d'optimiser (dans l'ordre je crois): les temps de pause, le vitesse d'allocation, et l'empreinte en jouant sur la taille de l'espace de génération (espace des objets à vie courte).
    Les performances du GC se mesurent plutot sur le long terme (justement une appli J2EE peut tourner des jours sans redémarrage).
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  3. #123
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Un GC, c'est :

    - un outil permettant d'éviter d'avoir à ramasser soi-même ses poubelles. Le concept d'éboueur quoi, et il n'y a pas de sous-métier...
    - une aide précieuse au développeur qui ne veut pas passer 25% de son temps à penser à libérer ses objets (ce qui ne dispense en aucun cas de déréférencer ceux-ci)
    - un outil pas adapté pour du temps réel sur architecture à mémoire très limitée, mais fort utile sur des applications d'entreprise...

    Et s'il vous plaît, arrêtez de dire que Java est lent à cause du GC, car :
    1- Java n'est plus aussi lent qu'avant (parfois aussi rapide que C++, n'en déplaise à certains)
    2- le GC ne s'exécute parfois jamais dans la durée d'une application (sisi...), il ne s'exécute quand il n'y a rien d'autre à faire...
    3- OCaml a un GC, et il est très efficace (cf les benchmarks vs C++)

    Au final, je tiens à mettre le doigt sur un ptit truc : si la gestion de mémoire explicite était la panacée, pourquoi les "pointeurs intelligents" seraient à la mode en C++ ?
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  4. #124
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Patriarch24
    Au final, je tiens à mettre le doigt sur un ptit truc : si la gestion de mémoire explicite était la panacée, pourquoi les "pointeurs intelligents" seraient à la mode en C++ ?
    La faute aux exceptions qui changent la donne par rapport à une approche explicite en C où la règle du Single-Entry Single-Exit (SESE pour les intimes) faisait la loi.
    Les exceptions incitent à partir vers le RAII si on veut du maintenable, les smart-pointeur n'étant qu'un cas particulier de RAII appliqué par défaut à la mémoire -- les pointeurs intelligents de boost (collection de bibliothèques C++) sont en fait plus des ressources intelligentes qui peuvent être appliquées sur n'importe quoi.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #125
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Dur à accepter...
    Deneb,

    Grâce au GC tu peux te concentrer sur le métier (Et développer plus vite !!! )

    Pour une bonne partie des applications d'entreprise peu importe la manière dont est gérée la mémoire. Personnellement je pense qu'il y a des gars chez Sun suffisamment compétents et qui ont eu largement assez de temps pour étudier la question en profondeur. En tout cas bien mieux que je ne le ferais moi même. Et grâce à leur travail je peux me concentrer sur l'essentiel : le business.

    Alors évidement si tes ressources sont extrêmement critiques un GC n'est pas la meilleure des solutions. Mais elle à le mérite de proposer un standard de prog qui satisfait la plupart des cas.

    Enfin si tu est tellement convaincu que la GC est une hérésie, Sun n'attend que toi pour révolutionner la JDK et supprimer çà pour la version 7 :

    https://jdk7.dev.java.net/collaborate.html


    https://jdk6.dev.java.net/collaborate.html

  6. #126
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    De toute facon ce débat est forcement un troll puisque il faut déjà savoir si l'on discute d'informatique des systèmes d'information ou alors d'informatique temps réelle et embarquée. Les besoins ne sont pas comparables.

    La où la ressource mémoire est limitée et figée, la gestion de la mémoire doit être fine. Il est alors en effet préférable de laisser le développeur gérer finement l'utilisation de la mémoire.

    Pour les SI, la mémoire est "abondante". On se concentre sur les problématiques métiers et la tendance est de déléguer un maximum de travail (persistance, sécurité, transaction, et ... gestion de la mémoire !) à un framework ou à un middleware.
    De manière générale, l'ingénierie des systèmes d'informations cherche à monter en abstraction depuis des années (ex: récemment, l'ingénierie des modèles). La gestion de la mémoire est une préoccupation de bas niveau qui n'interesse plus grand monde dans ce milieu.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  7. #127
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Plutôt d'accord avec Hephaistos007.
    Le GC c'est bien quand tu as suffisamment de ressources pour ne pas avoir à t'en occuper.
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  8. #128
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Citation Envoyé par zooro
    Plutôt d'accord avec Hephaistos007.
    Le GC c'est bien quand tu as suffisamment de ressources pour ne pas avoir à t'en occuper.
    ...le tout étant de ne pas se dire que l'on peut ne pas faire du tout attention à la mémoire sachant qu'il y a un GC. Il ne faut pas faire n'importe quoi (cf l'exemple de la boucle avec concaténation via l'opérateur +).

    Donc grosso modo, débat résumé en deux ou trois posts
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  9. #129
    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
    Il serait peut-être plus intérressant de donner des exemples de cas où on atteint les limites du GC...

    non ?

  10. #130
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par adiGuba
    Il serait peut-être plus intérressant de donner des exemples de cas où on atteint les limites du GC...

    non ?
    - J2ME, le lancement du GC demande des ressources, il impose aux developpeurs de s'assurer que le produit embarqué aura toujours les ressources nécessaire à l'execution du gc() sous peine de crasher la hot spot. La mémoire est un élement souvent critique en ce qui concerne les produits embarqués (même si c'est de moins en moins vrai)

    - Avec une grappe d'objet formant un grpahe cyclique d'une taille énorme. Le gc() va mettre énormement de rounds (voir jamais) pour determiner que tout ces objets sont "libérable". A ce stade, j'en conviens... ce n'est pas rééllement un problème liée au gc() mais à la programmation.

    - Application RT. le lancement d'un gc() n'est que trop rarement prédictif (en java c'est impossible)

    A n'en déplaise, je suis un partisan du gc(), mais ces differents arguments ont tous déja été dit. Ils le seront a nouveaux. et je ne vois pas d'avancée dans ce débat qui tourne en rond.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  11. #131
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Moi, l'exemple que je trouverais intéréssant, c'est la saturation des serveurs avec 4 GO de ram là où un serveur avec 10MO aurait suffit sans GC

    Plus sérieusement, les exemples oint déjà été donné, maintenant on le trouve valable ou non.
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  12. #132
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 33
    Points
    33
    Par défaut
    J'ai sans doute forcé un peu le trait mais on n'est pas si loin que ça de la réalité. Le cas typique qu'on a ici concerne le multithreading.
    Chacun sait (enfin ceux d'entre vous que les problèmes de mémoire intéressent encore ) que chaque nouveau thread consomme pas mal de mémoire. Or comme on écrit un serveur d'appli, on a pas mal de gestion en multithread...et le réflexe naturel du développeur Java c'est : une request entrante = 1 thread.

    A ce compte là, la mémoire occupée monte à vitesse grand V...et sature notre beau serveur avec ses 4 Go de RAM.

    Aujourd'hui on a une nouvelle version, beaucoup plus complexe il est vrai, mais dont chaque thread prend en charge plusieurs request en // et qui ne consomme plus rien...tout allant plus vite.

    Sinon vous pouvez fermez le sujet il ne reste plus grand chose à en dire.

    Moi je concluerais par le fait que beaucoup ne savent pas programmer proprement sans laisser trainer ses affaires et que pour ceux là il faut un GC (et un mec derriere pour leur éviter de tomber dans les gros pièges du GC).
    Pour les autres il manque juste deux choses à Java.
    • Une méthode System.release(ref) pour forcer le GC à libérer MAINTENANT un graphe d'objets.
    • La possibilité de définir des allocations dans la pile.
    Et comme tout est pour le mieux dans le meilleur des mondes, les deux sont à l'étude chez Sun...et c'est bien

  13. #133
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    c'est peu etre un peu hors sujet, mais plutot que de se demander GC ou pas on peux aussi se posé la question allocation dynamique ou pas, non?
    En effet la source du probleme c'est bien l'allocation dynamique qui selon moi doit etre utilisé avec la plus grande attention. Si l'on ne fait que tres peu d'allocation dynamique alors on peu se permettre une plus grande rigueur quant a sa gestion et la question du GC devient obsolette. Ceci dit je ne sais pas si cette remarque est pertinente en java et ou en C++.

  14. #134
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par cap2fosse
    c'est peu etre un peu hors sujet, mais plutot que de se demander GC ou pas on peux aussi se posé la question allocation dynamique ou pas, non?
    En effet la source du probleme c'est bien l'allocation dynamique qui selon moi doit etre utilisé avec la plus grande attention. Si l'on ne fait que tres peu d'allocation dynamique alors on peu se permettre une plus grande rigueur quant a sa gestion et la question du GC devient obsolette. Ceci dit je ne sais pas si cette remarque est pertinente en java et ou en C++.
    C'est une bonne remarque...
    Quand on développe en C, voir C++ on se pose toujours la question de la durée de vie des espace alloués et en général on essaye de reserver de manière statique tout ce qui peut l'être.
    Malheureusement les développeurs Java perdent tous cette bonne habitude et balancent du new à tout va juste au moment où ils ont besoin d'espace.
    C'est l'effet pervers de la perte de responsabilité...

  15. #135
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il faut dire que Java et .Net font la distinction entre type valeur et type référence. Un "type référence" est forcément alloué sur le tas, alors qu'un type valeur peut être sur la pile ou encapsulé dans un type référence.
    La différence entre Java et .Net, c'est que java ne permet pas de définir des types valeur complexes...

    Et en .Net, je ne sais pas si les types valeur peuvent avoir un destructeur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #136
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par deneb
    le réflexe naturel du développeur Java c'est : une request entrante = 1 thread.

    A ce compte là, la mémoire occupée monte à vitesse grand V...et sature notre beau serveur avec ses 4 Go de RAM.

    Aujourd'hui on a une nouvelle version, beaucoup plus complexe il est vrai, mais dont chaque thread prend en charge plusieurs request en // et qui ne consomme plus rien...tout allant plus vite.
    Je suis le seul à avoir l'impression que cette remarque concernant les thread n'a rien à voir avec le GC mais plutôt avec la compétence du programmeur ?...

  17. #137
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc
    Un "type référence" est forcément alloué sur le tas, alors qu'un type valeur peut être sur la pile ou encapsulé dans un type référence.
    je ne suis pas certain qu'un type référence dont tu parles soit alloué sur le tas directement vu qu'en .NET on n'accède pas directement à la mémoire mais via le Framework..
    je ne conseillerais pas de faire des analogies avec des langages compilés en code natif
    Et puis je me demande si en .NET ou Java lorsqu'on déclare par exemple int ma_variable en fait notre ma_variable devient un VARIANT comme en Visual Basic 6

  18. #138
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je parlais du Tas managé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #139
    mat.M
    Invité(e)
    Par défaut
    Ok il fallait préciser alors

  20. #140
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par davcha
    Je suis le seul à avoir l'impression que cette remarque concernant les thread n'a rien à voir avec le GC mais plutôt avec la compétence du programmeur ?...
    C'est lié !
    Un développeur, même très bon, mais qui n'a jamais développé dans un autre language que Java, n'acquiers pas les bons reflexes.

    J'ai aussi vu de bons développeurs très expérimentés faire des bourdes plus graves encore (moi le premier ), car quand on passe à Java, petit à petit on ne se pose plus la moindre question : on fait comme certains l'ont très bien dit : "confiance aux mecs de Sun qui ont du bien bosser pour que je puisse me consacrer uniquement au métier".
    Le problème c'est qu'un jour ou l'autre, tout ce que tu n'as pas vraiment géré et prévu te revient dans la tronche violemment.

Discussions similaires

  1. Garbage collector en C++, pour ou contre ?
    Par Klaim dans le forum C++
    Réponses: 70
    Dernier message: 05/08/2010, 14h03
  2. Le Garbage collector est-il fait pour cela ?
    Par macRiaz dans le forum Android
    Réponses: 16
    Dernier message: 24/02/2010, 00h01
  3. Réponses: 12
    Dernier message: 29/06/2009, 07h20
  4. Réponses: 1
    Dernier message: 03/06/2009, 00h25

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