|
Publicité | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
Note : ce débat a commencé sur le débat C# Versus Java
J'ai vu pas mal de monde dans ce thread citer le garbage collector de Java comme un avantage... N'y a t-il personne d'autre que moi pour penser que cette gestion auto est la pire connerie que Sun ait commise sur ce language (qui par ailleurs est plutôt réussi) ? Le concept même de GC est pour moi un non sens... Quel que soit le language. J'ai aussi utilisé un GC en C++ dans mon jeune temps et la conclusion fut la même : merdique, inutile, gaspillage de ressources et pire que tout : source de memory leak !!! Dernière modification par adiGuba ; 02/08/2006 à 14h56. |
|
|
|
|
|
#2 | ||
![]() Date d'inscription: avril 2002
Messages: 10 416
|
Citation:
Citation:
Maintenant il est facile de faire exploser le GC en lui faisant créer un grand nombre d'objet temporaire... mais c'est plus une faute de programmation qu'un problème de GC à mon avis... Maintenant, c'est sûr que selon la cible de l'application, ce n'est pas forcément la meilleure solution et que la gestion manuelle de la mémoire peut être plus performante... a++
__________________
adiGuba (blog & tutoriels) | Rédacteur/Modérateur Java Blog : Que peut-on attendre des closures de Java 7 ? | Projet Coin : Les modifications du langage pour Java 7 Créer des boutons avec les CSS3 |
||
|
|
|
|
#3 |
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
En fait je ne vois pas en quoi le GC apporte un plus...
Dans le pire des cas, sachant que le GC est là, le développeur ne se soucie pas le moins du monde de sa mémoire...et ça monte, ça monte. Donc vous me direz que la présence d'un GC ne dispense pas d'une gestion stricte de sa mémoire...(j'en sais qq chose). Mais dans ce cas si je dois continuer à gérer ça moi même, autant le faire jusqu'au bout car je sais le faire bien mieux que le GC...et surtout au bon moment ! Je n'ai jamais eu de pb de fuite de mémoire en C++ alors qu'en Java c'est assez fréquent et en plus elles sont beaucoup plus difficiles à repérer. Bref, le GC c'est sympa pour les débutants on pour faire des petits progs, mais pour écrire un serveur d'appli ... Dernière modification par Ricky81 ; 18/09/2006 à 19h12. |
|
|
|
|
|
#4 | |||||
![]() Date d'inscription: avril 2002
Messages: 10 416
|
Citation:
Le GC apporte plusieurs avantages :
Citation:
Citation:
Personnellement je préfère me concentrer sur le code métier de mon application... Citation:
Citation:
C'est dans le cadre de grosses applications que le GC devient très utile, puisqu'on a généralement de gros besoins d'allocation dynamique... a++
__________________
adiGuba (blog & tutoriels) | Rédacteur/Modérateur Java Blog : Que peut-on attendre des closures de Java 7 ? | Projet Coin : Les modifications du langage pour Java 7 Créer des boutons avec les CSS3 Dernière modification par Ricky81 ; 18/09/2006 à 19h15. |
|||||
|
|
|
|
#5 |
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
Débat intéressant isn't it ?
En fait on fait plus de leak avec Java qu'en C++ car justement Java facilite (encourage ?) la gestion à la méthode porcus. Alors qu'en C++ j'utilisais une stragégie d'allocation désallocation très stricte...j'ai perdu cette bonne habitude du fait du GC. (ainsi que la quasi totalité de développeurs java avec qui j'ai pu bosser, et il y en a un paquet). Le partage d'objets n'est pas du tout un pb sans GC...ou ça met en évidence un mauvais design. D'une manière générale, je trouve que le fait de déresponsabiliser le developpeur sur la gestion de la mémoire tend à faire des programmes qui consomment le triple de mémoire que nécessaire. Dernière modification par Ricky81 ; 18/09/2006 à 19h16. |
|
|
|
|
|
#6 | |||
![]() Date d'inscription: avril 2002
Messages: 10 416
|
Citation:
Mais quel que soit le langage la "méthode porcus" entrainera des problèmes Citation:
Citation:
Au contraire il faut prendre en compte le GC, et limiter au minimum le scope des différents objets temporaires... Pour moi il s'agit plus d'erreur de programmation (ou de fainéantise)... Enfin concernant les "memory leak" : avec un GC on ne peut pas vraiment parler de "memory leak" puisque cela signifie que l'on conserve toujours une référence vers l'objet... a++
__________________
adiGuba (blog & tutoriels) | Rédacteur/Modérateur Java Blog : Que peut-on attendre des closures de Java 7 ? | Projet Coin : Les modifications du langage pour Java 7 Créer des boutons avec les CSS3 |
|||
|
|
|
|
#7 | |||||
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
Citation:
Le problème avec Java c'est qu'en laissant croire qu'il gère la mémoire, il encourage les développeurs à ne pas se soucier du tout de cette question. Tu n'a qu'à voir le nombre de questions de développeurs relatifs à ce sujet ici et ailleurs "au secours j'ai plus de mémoire"... Citation:
Un service global qui alloue les objets que les sous services doivent se partager...c'est pas super compliqué. Citation:
Si le machin n'est pas capable de gérer parfaitement le pb de bout en bout (et ça n'est évidemment pas possible), je préfère le faire moi même. Sinon on reste le cul entre deux chaise et...le boulot n'est jamais bien fait. Ce que je veux dire c'est qui si je dois faire un effort pour gérer ma mémoire, alors ça ne me coute pas plus cher, ni en temps ni en fatigue cérébrale Citation:
Il faut en tenir compte dans les choix d'architecture qu'on fait Citation:
Leak est un abus de language de ma part. Il s'agit plus d'accumulation de références inutiles (fuite de mémoire). |
|||||
|
|
|
|
|
#8 | |||||
![]() Date d'inscription: avril 2002
Messages: 10 416
|
Citation:
Du coup si une application doit utiliser beaucoup de données (64 Mo ce n'est pas énorme de nos jours) elle se retrouve vite à l'étroit... Citation:
En C (j'ai très peu fait de C++), à chaque fois que j'utilisais une fonction qui maniait des pointeurs, je devais regarder dans la doc pour savoir comment c'était alloué et comment je devais libérer proprement la mémoire... Et j'ai également vu pas mal de programmes qui ne libéraient pas correctement la mémoire... mais comme il s'agissait de petit "batch" les effets n'étaient pas vraiment méchant... Citation:
Citation:
Citation:
![]() a++
__________________
adiGuba (blog & tutoriels) | Rédacteur/Modérateur Java Blog : Que peut-on attendre des closures de Java 7 ? | Projet Coin : Les modifications du langage pour Java 7 Créer des boutons avec les CSS3 Dernière modification par Ricky81 ; 18/09/2006 à 19h19. |
|||||
|
|
|
|
#9 | |||||||
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
Citation:
Ca fait 20 ans que je développe (enfin maintenant en hobiste parce que je suis passé du coté obscur) dont 6 ans en Java... Citation:
C'est valable pour la gestion des allocations comme pour tout le reste. Un objet qui alloue une ref et qui la largue dans la nature dans plus jamais la revoir et une erreur de design. Citation:
Si tu avais codé suffisamment longtemps en C/C++ tu aurais vu qu'après avoir codé comme un cochon quelques temps, tu mets petit à petit en place des stratégies de gestion de la mémoire très efficaces et qui ne te demandent plus le moindre effort intellectuel. Citation:
Je ne dis d'ailleurs pas qu'en C++ on ne fait pas de leaks, on oublie toujours de libérer un objet ! Par contre un simple petit coup de Purify (à l'époque...il doit y avoir encore mieux maintenant)...et tout est parfaitement clean. Citation:
Le pb c'est qu'il ne peut pas faire ce qui est impossible. Or, libérer la mémoire au bon moment...c'est pas possible, sauf pour le développeur. Citation:
Citation:
|
|||||||
|
|
|
|
|
#10 | |
|
Membre éprouvé
![]() Date d'inscription: juillet 2004
Messages: 466
|
Citation:
|
|
|
|
|
|
|
#11 | |
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
Citation:
|
|
|
|
|
|
|
#12 |
|
Membre éprouvé
![]() Date d'inscription: juillet 2004
Messages: 466
|
Ce qui veut dire qu'il fait régulièrement un calcul (certainement récursif, en tous cas assez complexe) sur un graphe qui peut avoir des centaines ou des milliers de noeuds ? Est-ce qu'il reste encore un peu de temps processeur pour l'appli elle-même ?
|
|
|
|
|
|
#13 | |||||||
![]() Date d'inscription: avril 2002
Messages: 10 416
|
Citation:
De plus ce sujet est potentiellement lu par d'autres personnes qui ne le savent pas forcément... Citation:
Mais je n'ai pas dit que le GC était LA solution... Il y a des applications où l'utilisation d'un GC n'est pas souhaitable. Par contre je trouve qu'il s'agit d'une solution plus que correcte dans bien des cas. Citation:
Sans rire : je connait les optimisation qu'il est possible de faire avec une gestion manuelle de la mémoire et des pointeurs... mais bien souvent l'utilisation d'un GC simplifie grandement le travail pour une différence finale minime... Citation:
Le code source ci-joint le montre bien (en utilisant des PhantomReference pour déterminer le moment où les références seront désalloué). Citation:
Citation:
Par exemple si tu prend le cas d'une boucle qui crée un nouvel objet temporaire à chaque itération, par exemple : Code :
for (int i=0; i<1000; i++) {
Object temp = new Object[1024];
}
Avec le GC, ces allocations/libérations seront regroupé, et donc moins fréquentes... En exécutant ce code avec l'option -verbose:gc qui affiche les actions du GC, et j'obtiens 4 parcours : Code :
[GC 892K->105K(5056K), 0.0016256 secs] [GC 998K->105K(5056K), 0.0005996 secs] [GC 999K->105K(5056K), 0.0002923 secs] [GC 1001K->105K(5056K), 0.0001104 secs] a++
__________________
adiGuba (blog & tutoriels) | Rédacteur/Modérateur Java Blog : Que peut-on attendre des closures de Java 7 ? | Projet Coin : Les modifications du langage pour Java 7 Créer des boutons avec les CSS3 |
|||||||
|
|
|
|
#14 |
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
C'est vrai que le GC de Java est bien écrit et je veux bien admettre que pour certains il facilite la tâche....pour créer d'autres problèmes
Pour ce qui est des perfs meilleurs par contre, c'est pas avec ton exemple que tu va me convaincre. Allouer un tableau à chaque tour d'une boucle c'est assez marrant...avec un new Object[1000][1024] ça marche plus. Ce que je regrette c'est : 1 : qu'il déresponsabilise les développeurs qui ne gerent plus du tout leur mémoire...ce qui va même jusqu'à leur faire oublier qu'elle est limitée. 2 : dans certains types d'application (et pas de bol on est pile dedans puisqu'on développe un serveur d'appli) un GC qui bosse quand il veut et bouffe du CPU en même temps pendant que les requêtes clients...c'est pas acceptable. Bref ce que je voudrais moi, c'est une option no-gc...histoire que ceux qui veulent se palucher la gestion à la main puissent le faire. |
|
|
|
|
|
#15 | ||||
![]() Date d'inscription: avril 2002
Messages: 10 416
|
Citation:
Donc il supprime réellement le tableau précédent à chaque itération : on se retrouve dans le même cas de figure qu'une gestion manuelle de la mémoire... Il serait ici préférable d'augmenter le heap pour limiter le nombre de libération... Citation:
Mais que ce soit avec un GC ou sans, dans une "grosse" application on est obligé de prendre en compte la mémoire... Citation:
Et si cela se produit trop souvent, c'est également que l'application consomme beaucoup de mémoire. Le fait qu'elle soit géré manuellement ne résoudra pas forcément le problème. Citation:
Mais un mot clef permettant de libérer manuellement un objet (s'il n'y a plus d'autres références vers celui-ci), c'est vrai que cela pourrait être utile, du style : Code :
Object o = new Object(); ... o = null-gc; // o vaut null et le GC tentera de le libérer a++
__________________
adiGuba (blog & tutoriels) | Rédacteur/Modérateur Java Blog : Que peut-on attendre des closures de Java 7 ? | Projet Coin : Les modifications du langage pour Java 7 Créer des boutons avec les CSS3 |
||||
|
|
|
|
#16 | |
|
Nouveau membre du Club
![]() Date d'inscription: août 2006
Localisation: RP
Âge: 38
Messages: 56
|
Citation:
Object ref = new Object(); // La JVM réserve la place pour mon instance dans le heap. ref.dispose(); // LA JVM marque la zone free. Mon pointeur devient invalide...mais mon objet est libéré. C'est ce pointeur vers une zone non controlée qui gène les architecte de Java. A la limite, ça peut se résoudre en rajoutant un mot clé au language : free ref; ///marque la zone free et met ref à null. On va voir ce qu'ils en disent sur le forum Sun |
|
|
|
|
|
|
#17 | |
|
Membre actif
![]() Date d'inscription: juin 2006
Localisation: Rennes
Messages: 194
|
Citation:
Ca pourrait ressembler à quelque chose comme ça : Code :
no-gc {
//bloc d'instruction
}
Code :
System.no_gc(1000); |
|
|
|
|
|
|
#18 |
![]() Nom : Nicolas Vallée
Date d'inscription: décembre 2005
Âge: 25
Messages: 9 142
|
perso, je pense qu'il faudrait d'abord se demander quelle genre de gc serait vraiment utile ?
en effet si, comme moi, vous étudiez un peu les compilateurs, vous remarquerez que nombre de reproches faits au gc sont souvent dûs à l'implémentation fort naïve du gc de la jvm de sun pendant fort longtemps... au début un simple compteur de références si je ne m'abuse par ailleurs, loin de moi l'envie de congratuler crimosoft (cf mon avatar), je pense que dans des applications où l'on souhaite pouvoir effectuer des optimisations, il est certes fort appréciable de disposer d'une gc, mais à l'unique condition qu'elle nous laisse parfois garder la main... comme celle de .net avec le langage c# par exemple. après, pour avoir fait beaucoup de c et d'assembleur, il est vrai que la gestion de la mémoire (allocation et libération) peut parfois prendre une proportion non négligeable de projets qui aurait pu être faits plus simplement sans ce "détail", surtout quand le but n'est pas d'optimiser à mort... |
|
|
|
|
#19 |
|
Membre éprouvé
![]() |
Alors je vais faire une peu de "dévanalyse" (joli le mot ^^)
Le Garbage Collector est un résultat de l'évolution du "développement". Il y a 15 ans on devaient apprendre comment "swapper" le contenu de deux variables sans utiliser une troisième afin d'économiser au mieux l'utilisation de nos registres quand on développait en assembleur. Nous avons eu droit ensuite à dés langages de plus haut niveau tel que le C. A cette époque les pro-assembleurs se targait de la mauvaise gestion mémoire / registres des programmes compilés en C Quelques années plus tard, les languages POO sont apparus dont nottament Java. En plus des nouvelles méthodologies de conception, ces languages nous ont fait rentré dans une ère ou des APIs extremement riches ont elevés le niveau des développements. Aujourd'ui on éleve encore un cranc ce niveau avec l'utilisation de ce qu'on appelle les "MiddleWare" (J2EE & Co). L'ultime but de ces évolutions: Limiter la couverture de dévelopement aux parties métier uniquemement. Tout le reste doit être à la charge du language, outils, serveur et autres joyeuseries. Le Garbage Collector se positionne trés bien dans cette optique et de ce fait il est trés bénefique. Oui les nostalgiques diront "Mais quand je manipule mes pointeurs, je sais quand je dois liberer mes allocations mémoire !! ". Certe mais séparer le "system" du "metier" va dans le sens d'un code plus robuste et maintenable. Alors un GRAND OUI au Garbage Collector. PS: On pourrait par exemple faire la comparaison avec Hibernate qui gére la persistence à notre place. Ce qui en bon middleware nous permet de nous préoccuper des données avant tout (la persistence n'étant que de la technique). Certains diront toujours "oui mais en C je gére mes flushs au bon moment..." Ok, mais c'est le passé....... |
|
|
|
|
|
#20 | |
|
Membre actif
![]() Date d'inscription: mai 2004
Messages: 194
|
Citation:
Mon avis perso et que le GC est une chose largement "utlisable" ( notez que je ne dis pas bonne ou mauvaise ). Avec un peu de bouteille en Java (C# je ne connais pas) on fait vite gaffe aux references non utlisées et autres petites tracasseries liés au GC. Apres ca devient un refelxe. Je ne trouve pas ca plus containgnant que de faire des free en C ou des destructeurs en C++ ... Par contre mon principal reproche vise l'implementation du GC, qui sur versions differentes du runtime et en fonction des plateformes ne se comporte pas tout a fait de la meme maniere. Par ailleurs il y a un manque cruel de doc "comprehensibles" pour optimser le GC. Avec le temps et l'experience on y arrive, mais je reconnais que c'est loin d'etre evident. Apres pour ou contre, je reste neutre J'aime programmer en Java, un language qui a d'excellentes qualités. Pour cela il faut savoir utliser et bien parametrer le GC pour que les softs en tirent un avantage et pas des incovenients. C'est une contrainte de dev parmi d'autres sur un projet .... |
|
|
|
|
|
|
![]() |
||
Pour ou Contre le Garbage Collector ?
|
||
| Outils de la discussion | |
|
|