|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | ||
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2003 Messages : 4 325 ![]() |
Citation:
b- Le partage en lui même n'est pas ce qu'il y a de plus important, car c'est facile à réaliser, en C++ du moins. En revanche les GC (hormis le premier de Java) savent gérer les cycles. Le plus gros avantage des GC, je trouve. c- C'est un aspect assez connexe au principe des pools. Même en C et C++ on sait faire en détournant les opérations d'allocation. Et ce n'est pas forcément un avantage chez les GC (d'une VM à l'autre, il y a parfois des progres). On gagne certes un temps global d'exécution plus court, mais on peut avoir un effrondrement des perfs à tout moment car l'heure de la collecte est arrivée. Citation:
De mémoire, petit détail que je trouve assez intéressant la VM de .NET permet de distinguer la finalisation des objets, et en particulier de la rendre déterministe, de la collecte de la mémoire. Avec l'arrivée du C++/CLI, on a eu quelques papiers s'auto-congratulant sur un GC qui ne reniait pas le déterminisme et qui marchait main dans la main avec le RAII.
__________________
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. |
||
|
|
00
|
|
|
#22 | |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Hibernate rajoute certes une couche très abstraite entre les services métier et la JDBC, mais le travail qu'il réalise est énorme, tout autant que le temps de développement qu'il fait gagner. En contrepartie, il consomme un peu de ressources. Admettons qu'il bouffe 10%, je dois acheter une machine 10% plus puissante en contrepartie, je rajoute donc généreusement 300€ sur la facture. 300€ c'est le coût d'une journée de développement....Est-ce qu'Hibernate m'a fait gagner plus d'un jour de développement sur le projet ? Et oui, largement ! Donc Hibernate me fait économiser de l'argent ! Par contre pour le GC, je vois pas.
|
|
|
|
10
|
|
|
#23 |
|
Expert Confirmé Sénior
![]() |
Je l'ai déjà posté ailleurs, mais pour moi le GC devrait être un complément du comptage de références:
__________________
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. |
|
|
00
|
|
|
#24 | |
|
Membre expérimenté
![]() |
Citation:
Je dis simplement qu'ils sont tout les deux le fruit d'une même mouvance : "Focaliser le développeur sur le métier" PS: le travail que réalise le GC est également énorme, ne te fourvoye pas. |
|
|
|
00
|
|
|
#25 | |
|
Membre expérimenté
![]() |
Citation:
Maintenant je mène un projet J2EE depuis 2.5 ans, évidemment nous avons eux des memory leaks. 2x jours nous on suffit pour supprimer la majeur partie. J'estime que ce coût n'est pas excessif, et n'est pas exagéré par rapport au temps passé sur des versions C,C++. J'ai connu bien plus de déboire sur la gestion mémoire du temps du C/C++. |
|
|
|
00
|
|
|
#26 | |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Autant de temps perdu à gérer la mémoire...et ses fuites, avec ou sans GC ! |
|
|
|
00
|
|
|
#27 | |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Tu as fait un parallele entre les deux et je te dis qu'il n'est pas correct car même si les deux ont pour but de prendre en charge une partie des tâches compliquées normalement dévolues au developpeur, Hibernate y arrive et me fait gagner de l'argent alors que le GC au mieux ne me rapporte rien, au pire il me fait perdre du temps (de l'argent donc) |
|
|
|
00
|
|
|
#28 | ||
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Bon allez, on peut continuer à parlez philo si vous le souhaitez, mais il est clair que mon option "no-gc" ne pourra jamais exister.
Tout ça à cause d'une autre hérésie de design de Java : les objects "unmutable" comme le très célèbre String. Pour les amateurs de C++ qui trainent sur ce sujet et qui ne sont pas familiers de ce concept "avancé" Fort de se principe...on peut se permettre qq hérésies comme ce constructeur de String qui est sensé contruire une nouvelle String avec la valeur d'une autre en argument... Voila le code (épuré pour ne faire apparaitre que l'essentiel) Code :
|
||
|
|
10
|
|
|
#29 |
|
Membre expérimenté
![]() |
A ton avis pourquoi les chaines (String) sont immuables ? ...
Tout simplement pour économiser la mémoire !! et oui. Car finalement si dans une classe tu écris Et que par ailleurs tu écris Et bien la JVM peut pour optimiser en affectant la meme "réference" (InternalString) aux deux variables car elle sait que la classe String lui garantie que personne ne touchera à son contenu. Au vue de la profusion de l'utilisation des chaines dans une application, ce type de gestion a son avantage Je te l'accorde, cela a aussi ses inconvénients Pour ce qui est du constructeur, la remarque a déja été faite sur le forum Java. Et meme la javadoc du constructeur annonce clairement qu'il ne sert pas a grand chose sauf cas extremement spécifique où on désire une autre instance de la chaine. |
|
|
00
|
|
|
#30 |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
C'est vraiment pour économiser de la mémoire qu'on utilise des immuables...et donc un GC...qui entraine un gaspillage de mémoire ?
|
|
|
00
|
|
|
#31 |
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Just kidding man
Tu cherches à me convaincre ? Pourquoi pas...en tout cas on peut en parler, après tout c'est le coin des débats. On n'est pas obligé d'arriver à un consensus, l'interet c'est de parler du sujet. Après tout, on peut reprendre la question à la base : A quoi sert le GC ? Qu'apporte t-il de tangible au développeur ? - Gain de temps ? - Gain d'efficacité ? - Gain de performance ? Et quels sont les revers de la médaille ? |
|
|
00
|
|
|
#32 |
|
Membre expérimenté
![]() |
Je suis partant
On peut penser que le GC sert a gerer la libération mémoire à la place du développeur. Ce qui est FAUX !! Le GC change la méthode de libération mémoire de la part du développeur. Au lieu de la liberer explicitement (et donc coder ces algos maisons determinant si un objet peut etre liberé), avec un GC on doit simplement "liberer" un objet en arrettant de le referencer lorsque celui-ci n'est plus nécessaire (pour le referant) Si le developpeur est rigoureux sur ce dernier point, le GC fera son travail aussi bien qu'un developpeur faisant tout a la main. D'autant plus que nous avons des outils (WeakReference,SoftReference) pour aider le GC a casser les references cycliques et gerer les caches ou pool. Mais alors quel est l'avantage ? - La liberation par le GC est fiable: il ne liberera pas un objet qu'il ne fallait pas - Le développeur pilote la gestion mémoire d'une façon plus "confortable" et n'a pas a mettre en oeuvre tout un tas de mécanisme. Quel sont les inconvenients ? - On ne contrôle pas le moment de la libération - Si on ne "casse" pas les réferences inutiles, on se prends des memory leaks Le dernier incovenient n'est pas trés "recevable" puisqu'il correponds à un developpeur C ne fesant aucun "free()" aprés des "malloc()". Dans ce cas il faut patcher le développeur pour rattraper le tir ^^ Voila ;o) |
|
|
00
|
|
|
#33 | |||||
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Ahh de la matière
Citation:
Parfois il faut bien dire qq conneries. On peut bien se détentre un peu ici ? (on est pas du coté "help me"). Citation:
Citation:
Citation:
A l'inverse une Map qui accumule des références indésirables, ça ne se voit pas. C'est même le genre de sournoiserie qui ne se manifeste qu'à forte charge quand tous les clients sont connectés... Je préfère de loin le premier cas. Ensuite ce que tu appelle du confort est pour moi une incitation à une gestion "laxiste"...Et en regardant le code des mes équipes, je crois bien que j'ai un peu raison sur ce point. Citation:
Mais cette bonne gestion demande exactement la même discipline et le même temps qu'une bonne gestion manuelle. Sauf qu'à la main, le travail est FAIT et on ne voit pas de GC s'inviter de manière intempestive au moment où on a besoin de CPU. |
|||||
|
|
10
|
|
|
#34 | ||||||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Enfin, les objets immuables permettent une optimisation de la mémoire en évitant des copies d'objets à tout va, comme cela peut être la cas en C++ pour respecter la règles "le créateur est responsable de la durée de vie des objets"... Citation:
Citation:
C'est la même chose qu'un développeur C qui n'utiliserait que des variables globales... Citation:
Citation:
Le problème de la Map avec des références indésirables est plus proche d'un oubli de libération de mémoire ! Si tu conserves une Map avec de nombreux objets indésirables, c'est comme si tu ne faisais pas de free() après tes malloc() : c'est une erreur de programmation ! Et dans ces deux cas, il te faudra surveiller la consommation de mémoire de ton application... Citation:
Citation:
Citation:
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||||||
|
00
|
|
|
#35 | ||||||
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
C'est une portion (copiée/collée) d'un constructeur de String pris dans le source du JDK 1.5_07. C'est d'ailleurs assez logique qu'ils procèdent comme ça, puisque l'objet est immuable...On peut se dire que lorsque tout le monde en aura fini avec ce tableau de char, le GC finira bien par le ramasser. Désolé, c'est une conception qui ne me satisfait pas. Citation:
Les chaines sont stockées sur des supports externes (fichiers, bdd,...) et son chargés dans des conteneurs à l'exécution...Dans ce cas je vois pas l'économie. Citation:
D'ailleurs regarde un peu au tour de toi...en quoi sont écrit 90% des softs que tu utilise ? Citation:
Citation:
Est-ce que le partage d'objets entre plusieurs serveurs te parait une chose compliquée ? Pas besoin de GC pour faire ça pourtant. Citation:
Avec ou sans GC il faut faire son taf de développeur. Là ou mon point du vue diffère du tien, c'est qu'ayant développé très très longtemps en C, pas mal en C++ et finalement encore plus en Java, je SAIS d'expérience que l'effort demandé dans un cas comme dans l'autre est le même. |
||||||
|
|
10
|
|
|
#36 | ||||||||||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Code :
Citation:
Si cela ne te sastifait pas, c'est que ce serait trop dur à gérer sans GC... Citation:
Citation:
Citation:
Ensuite l'économie de l'immuabilité vient du fait que l'on n'est plus obligé de créer des objets temporaires pour les attributs de nos objet. Par exemple si j'ai une classe qui utilise un attribut de type String, je peux utiliser la même référence sans craindre qu'elle soit modifier de l'extérieur de ma classe par un code du style : Code :
En C++ le moindre passage d'objet à une méthode implique une copie de l'objet. A moins de passer via les références, mais dans ce cas il faudrait faire une copie explicite pour éviter qu'un attribut ne soit modifié en dehors de la classe... Les classes immuables sont une notion importante de Java, et peu présente en C++. Cela fait un approche relativement différente de la conception des objets... Citation:
Citation:
Citation:
Citation:
Citation:
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||||||||||
|
00
|
|
|
#37 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 15 ![]() |
Tu es assez buté Deneb.
Je ne connais pas ton parcours ni les types de projet surlequels tu as travaillés mais le théorie "Celui qui créé, détruit" n'est pas toujours applicable même si elle doit être au max respectée. Il y a beaucoup de types différents de projets et je t'assure que même en étant un développeur C chevronné, les fuites de mémoires peuvent devenir un vrai casse tête dans certains projets et assurer une gestion parfaite de la mémoire (sans fuite de mémoire ni libération abusive) demande tellement de temps que l'utilisation d'un GC s'impose. Encore une fois, a moins de travailler sur un projet dont la ressource processeur est très très critique, l'éxecution du GC ne ralentit franchement pas. Je veux bien croire que ce problème peut exister coté serveur (et encore, dans des cas spécifiques) mais coté client j'ai du mal à croire que le GC ralentit la machine. Aujourd'hui les processeurs passent leur temps à attendre les autres ressources et le GC s'insère très bien entre deux appels disque/réseau/utilisateur de ton appli. |
|
|
00
|
|
|
#38 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2006 Messages : 15 ![]() |
Concernant la question initiale "Pour ou contre le Garbage Collector".
Je répondrais ce que je réponds souvent à ce genre de question : "Ca dépend du projet". Si c'est un projet "classique" qui ne demande pas à utiliser comme un dingue le processeur, alors le GC sera un plus car il permettera d'améliorer grandement la gestion de la mémoire et de gagner pas mal de temps la dessus. Si la gestion de la mémoire est très importante dans le projet et qu'il faut impérativement la gérer "à la main", alors ne pas utiliser de GC (ce qui veut dire ne pas coder en Java). Java n'est pas le meilleur langage, aucun n'est parfait. Il répond à des besoins. Comme le GC. S'il ne convient pas à un besoin, et bien on ne l'utilise pas et c'est tout ! Pour moi il n'y a pas de choix à faire entre "pour ou contre GC", ca dépend de l'appli. C'est d'ailleurs pour cette raison qu'un developpeur doit connaitre plusieurs langages |
|
|
00
|
|
|
#39 | |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Citation:
A priori, le débat me semble un peu creu, dans la mesure où les langages dignes de ce nom sont turning complet. La question n'est donc pas de savoir ce qui peut ou ne peut pas être fait, mais plutôt si le GC ou la gestion manuelle de la mémoire permettent de programmer plus "proprement", efficacement. Encore que "proprement"... Ce terme est suffisamment vague pour que quelqu'un vienne dire que l'utilisation d'un GC n'est pas propre ou inversement que la gestion manuelle de la mémoire peut devenir une usine à gaz, sans pour autant amener d'arguments valables. Personnellement, je programme principalement en C# et C++. Je trouve le GC du C# très intéressant, car il augmente ma productivité. Et quand j'ai des parties de code où la gestion de la mémoire est critique (que ce soit pour des questions de perf ou de minimalisations d'utilisation mémoire), je passe en C++, où je gère la mémoire directement, sans GC. Je vois pas tellement le problème en fait. Il y a des cas où le GC est super, d'autres où une gestion manuelle est préférable... |
|
|
|
00
|
|
|
#40 | ||
|
Membre à l'essai
![]() Inscription : août 2006 Messages : 56 ![]() |
Citation:
Citation:
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com