Envoyé par
adiGuba
Ceci est FAUX : le constructeur String(String) est bien un constructeur de copie, et crée bien un nouvel objet totalement différent en mémoire ! D'ailleur c'est indiqué dans la Javadoc : "the newly created string is a copy of the argument string"...
Alors là je crois que tu ferais bien de réviser un peu...
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.
Envoyé par
adiGuba
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"...
Les immuables permettent d'économiser des bouts de chandelles. Essentiellement sur des String. Dans une vrai appli il n'y a AUCUN appel du type : String s = new String("toto"
;
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.
Envoyé par
adiGuba
Ce design pattern te convient peut-être, mais il n'est pas adapté à tous les besoins. Le créateur des objets peut ne pas connaitre la durée de vie exacte des objets, et donc cela complexifie encore les choses...
Je vais pas te citer tous les projets sur lesquel j'ai bossé en plus de 10ans de vie professionnelle (je te fais grâce des 10 précédentes ou je développais en hobbiste, parfois payé). Ce design convient à TOUS les types d'application.
D'ailleurs regarde un peu au tour de toi...en quoi sont écrit 90% des softs que tu utilise ?
Envoyé par
adiGuba
Grande rigueur : il ne faut pas exagérer... Il faut juste éviter de multiplier les champs static et d'utiliser 500 attributs dans les objets, alors que la plupart des éléments ne servent que temporairement, ou de les mettres à null lorsqu'on n'en a plus besoin... mais c'est une erreur de programmation, pas un défaut du GC...
C'est la même chose qu'un développeur C qui n'utiliserait que des variables globales...
On tourne en rond...Je te répond que sans GC, il suffit de gérer correctement les new/free. Celui qui réserve libère et puis c'est tout.
Envoyé par
adiGuba
C'est peut-être vrai dans le cas où le créateur est responsable de la durée de vie des objets... mais faux dans des cadres plus complexe où tu dois partager des objets...
Je ne vois pas...En matière de complexité un serveur d'application se place sur quelle échelle selon toi ?
Est-ce que le partage d'objets entre
plusieurs serveurs te parait une chose compliquée ?
Pas besoin de GC pour faire ça pourtant.
Envoyé par
adiGuba
Tu ne compares pas ce qui est comparable... tout simplement parce que la libération par erreur est impossible avec un GC !
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...
Le GC n'est pas miraculeux : il ne peux pas conserver plus d'objet que sa mémoire ne lui permet... mais personne n'a dit le contraire !
Jamais dit le contraire.
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.
1 |
0 |