Pollux (./20) :
BookeldOr (./18) :
Kevin Kofler (./17) :
(chose qu'un GC rend impossible, justement, donc le GC est embêtant dès que tu as des ressources qui ne sont pas libérables par le GC, genre des fichiers, tu te retrouves à coder des close() à la main comme en C).
Il est tout à fait possible qu'un GC ferme les fichiers en libérant les handles (ceci dit, je ne sais pas ce que celui de Java fait).
Beurk, ce serait super crade parce que le moment de fermeture serait pas du tout déterministe
La seule réaction logique ce serait plutôt de lancer une exception si on garbage-collecte une ressource non fermée ^^
Mouais, "ça se discute"©
Pollux (./20) :
Oui, mais c'est loin d'être optimal.
Dans quel sens ?
D'abord dans le sens où le GC de Boehm est un GC conservatif (à racines ambigues), donc si tu as alloué un gros bloc à l'adresse 42 et que ton programme contient une constante 42 qui n'a rien à voir avec un pointeur, la zone ne sera pas libérée ; de plus, si le langage fait des trucs tordus avec les pointeurs (genre les encoder, les transformer en offsets, appliquer des masques ou ce genre de trucs) le GC peut libérer des zones utilisées.
Un GC dédié à Java connaîtrait exactement la forme des structures, et donc saurait distinguer exactement ce qui est un pointeur de ce qui ne l'est pas.
De plus, comme il est générique, il n'est forcément pas optimal par rapport au fonctionnement de tel ou tel langage (au niveau du déclenchement, de la taille à libérer à chaque fois, du sous ensemble des racines et du tas à analyser à chaque passe, etc.).
Plus concrètement sur un exemple : un bon allocateur/GC pour Java mettrait (exemple bidon) les wrappers des types natifs (les classes Integer, Character, ...) dans une partie "éphémère" sur laquelle le GC serait déclenché plus souvent, alors qu'il mettrait des classes durant plus longtemps (genre les classes de fenêtres, les fichiers, les sockets, ...) dans une partie du tas nettoyée moins souvent.
Et si je ne me trompe pas, le GC de Boehm ne sait pas compacter, donc il ne libère pas souvent de la mémoire au système (voire jamais).
Le gros problème de perfs de Mono par rapport à .Net vient du fait qu'ils n'ont pas un super GC dédié et finement adapté mais qu'ils utilisent celui de Boehm (ils travaillent dessus).