BookeldOrLe 26/06/2007 à 21:12
Dans un bon gc, il y a une partie faite très régulièrement qui fait ce que vous décrivez : simplement nettoyer la mémoire interne pour la réutiliser, et un second comportement, plus coûteux donc déclenché peu souvent, qui compacte la mémoire pour rendre la partie inutilisée à l'OS.
C'est normal que si un processus consomme énormément de mémoire il ne la rende pas tout de suite.
Mais si ça ne la rend jamais ou extrêmement rarement, c'est que le GC est pourri ou que le système d'exécution rend cette phase trop complexe à mettre en œuvre.
Lorsqu'on compacte le tas, on modifie les pointeurs sur la pile, ce qui n'est pas trivial du tout suivant le modèle d'exécution, par exemple si on mélange plein de langages ou qu'on appelle des modules externes avec des pointeurs. Dans le dernier cas, il est possible soit de tout boxer (passer par une indirection supplémentaire) soit de garder un tas pour les références "externes", mais si ça na pas été prévu dès le départ, c'est le merdier.