“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 78 — #88
i
i
i
i
i
i
i
i
78
2
• La programmation déclarative
Les algorithmes modernes de ramassage de miettes sont suffisamment efficaces
pour que la plupart des applications puissent les utiliser avec seulement une petite
dégradation des performances en temps et en espace [47]. Pour certains systèmes,
le ramasse-miettes est même plus efficace que la gestion manuelle de mémoire. Les
ramasse-miettes les plus largement répandus s’exécutent dans un mode de fonctionnement par lots (« batch »). Ils sont inactifs la plupart du temps et ils ne s’exécutent
que quand la quantité totale de mémoire active et inactive atteint un seuil prédéfini.
Quand le ramasse-miettes s’exécute, il y a une pause dans l’exécution du programme.
Généralement, la pause est suffisamment petite pour ne pas gêner l’utilisation du
programme.
Il existe des algorithmes de ramassage de miettes, appelés ramasse-miettes tempsréels, qui peuvent s’exécuter continuellement, entrelacés avec l’exécution du programme. Ils peuvent être utilisés dans les cas pour lesquels les pauses sont inacceptables, comme le traitement en temps réel dur.
2.5.4 Le ramassage de miettes n’est pas magique
Le ramassage de miettes allège le fardeau de la gestion de mémoire pour le développeur, mais il ne l’élimine pas complètement. Il y a deux cas qui restent la responsabilité
du développeur : éviter les fuites de mémoire et gérer les ressources externes.
Éviter les fuites de mémoire
Le programmeur a toujours une responsabilité par rapport aux fuites de mémoire.
Si le programme continue de référencer une structure de données dont il n’a plus
besoin, alors la mémoire de cette structure de données ne sera jamais récupérée. Le
programme doit être attentif à éliminer toutes les références aux structures de données
dont il n’a plus besoin.
Par exemple, prenons une fonction récursive qui traverse une liste. Si la tête de la
liste est passée à l’appel récursif, alors la mémoire de la liste ne sera pas récupérée
pendant l’exécution de la fonction. Voici un exemple :
L=[1 2 3 ... 1000000]
fun {Sum X L1 L}
case L1 of Y|L2 then {Sum X+Y L2 L} else X end
end
{Browse {Sum 0 L L}}
Sum additionne les éléments d’une liste. Mais il garde aussi une référence à L, la liste
originale, quoiqu’il n’ait pas besoin de L. Cela veut dire que L restera en mémoire
pendant toute l’exécution de Sum. Une meilleure définition est la suivante :
Précédent

- 93/370

Suivant