Ah oui, d'accord. Je savais pas qu'IE6 utilisait cela.
Alors pour ceux que cela intéresse. La technologie des ramasse-miettes n'est pas "facile" : la méthode naïve est de compter les références (les liens vers un objet), lorsqu'il n'y en a plus, c'est que l'objet n'est plus utilisé et le ramasse-miette lorsqu'il parcourera tous les objets s'il en voit un avec 0 liens vers lui, l'effacera. C'est une manière assez pratique car on peut tout à fait utiliser un fil en arrière-plan pour le faire car un objet qui est à 0 liens n'en récupérera jamais. Ainsi on a pas besoin d'arrêter le navigateur lorsque le ramasse-miette tourne. De plus l'algorithme de marquage est simple (O(1) en terme algorithmique.
Le gros hic de cette manière de faire, c'est que cela ne permet pas de trouver tous les objets inutiles. En effet si on a une référence circulaire: A -> B -> A qui n'est liée par personne d'autres, elle devrait être effacée, mais ne le sera jamais avec l'algorithme de comptage puisque A a un lien vers lui (depuis B) et B a un lien aussi (depuis A).
C'est pour cela que dès les années 1960 (et le langage Lisp — surnommé
Langage idiot saturé de parenthèses), un nouveau type de ramasse-miettes a été inventé: les GC
mark-and-sweep (marquer-puis-effacer). Comme le nom l'indique il y a deux phases: une phase où il parcourt tous les liens depuis les objets globaux et il y marque tous les objets atteints. Tout ceux qui sont marqués ne doivent pas être effacer. Puis une seconde phase où il parcourt séquentiellement (par ordre de création par exemple) tous les objets js et efface ceux qui ne sont pas marqués. Ainsi pas de soucis avec les cycles, pas de fuites mémoires.
Par contre cet algorithme, outre une complexité plus grande (et donc une utilisation processeur un peu plus grande) a un inconvénient: pendant qu'il a lieu, on ne peut ni créer ni effacer des objets js. On
arrête le monde (d'où le nom de ces ramasse-miettes:
stop-the-world). Firefox a un tel algorithme. La plupart du temps on ne remarque pas les pauses GC, mais ces derniers temps avec la vidéo ou l'apparition de jeux et d'animations js qui nécessite une grosse fluidité et créent beaucoup plus d'objets js, c'est devenu un problème. Pour le diminuer, Firefox 4 a diviser les objets js en compartiments indépendant (typiquement un par onglet, plus quelques autres). Ainsi chaque compartiment nécessite une pause plus courte pour être nettoyé, et les compartiments peu modifié y passent moins souvent. (Cela a un autre avantage, il permet de connaître la consommation mémoire par onglet, affiché dans
about:memory dès Firefox 7, en Aurora, maintenant; cadeau bonus du travail fait pour Firefox 4!)
Firefox migre désormais vers un nouveau ramasse-miettes, toujours
mark-and-sweep mais plus
stop-the-world. C'est en cours et la première phase devrait dans Firefox 8 ou Firefox 9 (C'est le
Bug 641025 —[meta] Incremental GC).
Dès que ce sera prêt, les pauses ne devraient plus être ressenties. Pour une animation, si auparavant elle faisait 30 images/s mais tomber à 0 images/s pendant 200 ms toutes les 40s, avec le nouveau elle fera peut-être 29 images/s mais en permanence). Ce sera bien mieux.
Voilà, j'espère que cela vous a aider. Gardez néanmoins à l'esprit que l'on n'a fait que survoler la problématique: le ramasse-miettes a des incidences sur le cache, le paging, la localité du code, l'utilisation CPU, l'utilisation mémoire, la fragmentation et la sécurité et bien sûr la stabilité: le moindre bug dans le ramasse-miettes fait crasher (souvent) le navigateur.
Il y a plusieurs développeurs de Firefox qui ne s'occupent que du ramasse-miettes. C'est important et pas très visible pourtant.