Tout programme doit répondre à une question : quand libérer la mémoire allouée ? Il existe trois réponses courantes, et chacune implique un compromis différent.
Collecte automatique des déchets
Le programme continue à distribuer librement ; périodiquement, une équipe de collecte des déchets fait le tour pour repérer les zones où plus personne ne vient chercher les objets, puis les récupère.
- Avantages : le programmeur n'a pratiquement pas besoin de réfléchir, aucun risque d'utiliser de la mémoire déjà libérée
- Inconvénients : des temps d'arrêt imprévisibles lors de l'exécution du ramasse-miettes, et une consommation de RAM supérieure au nécessaire
Convient aux services de serveurs et aux applications métier — où le débit prime sur la latence maximale.
Nombre de références
Chaque objet est associé à un compteur. L'ajout d'une référence fait augmenter ce compteur, sa suppression le fait diminuer, et lorsqu'il atteint 0, l'objet est immédiatement libéré.
- Avantages : libération au bon moment, pas d'arrêt inopiné
- Inconvénients : coût à chaque affectation, et incapacité à gérer les cycles de référence — si A contient B et B contient A, les deux ne reviennent jamais à 0
Propriété et emprunt
Le compilateur surveille qui occupe la mémoire et insère des instructions de libération aux bons endroits dès la compilation. Pas de ramasseur, pas de compteur, aucun coût à l'exécution.
- Avantages : aussi rapide et prévisible que la gestion manuelle, mais plus sûr
- Inconvénients : l'auteur doit s'adapter à un nouveau mode de pensée, et certaines structures de données deviennent difficiles à exprimer
Il n'y a pas de choix gagnant à coup sûr
Les systèmes en temps réel et les logiciels embarqués optent pour la troisième approche, car aucun temps d'arrêt n'est toléré. Les applications web optent pour la première approche, car le gain de temps pour l'utilisateur prime sur quelques dizaines de millisecondes. Les deux approches sont valables dans leur contexte respectif.
Thảo luận