3.2.5 Destruction des objets
- Pas de technique particulière pour détruire un objet
- Objet détruit lorsqu’il n’est plus
référencé
- Utilisation d’un ramasse miettes
- Le Garbage Collector détruit les objets non référencés
- La destruction est asynchrone
- Il n’y a pas de garantie sur la destruction (le
programme peut se terminer avant que l’objet ne soit détruit)
- Si la classe décrit une méthode appelée finalize, cette méthode est appelée avant la libération de
la mémoire de l’objet
précédent suivant
Comme nous l’avons dit dans l’introduction, le
langage Java a été pensé pour pallier les principales difficultés du langage
C++ et en particulier, les erreurs associées à
la gestion des références vers les objets. Il est en effet difficile de
garantir qu’un objet est désalloué lorsqu’il n’est plus
utilisé.
Les langages modernes et Java en particulier prennent à leur
charge la gestion des allocations et des libérations de la mémoire en tenant à
jour la liste des références vers les blocs alloués. Pour Java, c’est la
machine virtuelle Java qui réalise ces opérations et qui met en œuvre un
ramasse miettes pour vérifier périodiquement que les objets alloués sont
toujours référencés.
Lorsque les objets ne sont plus référencés, le ramasse
miettes récupère l’espace mémoire qu’ils occupent. Puis, il met cet
espace mémoire à la disposition de la création de nouveaux objets.
Ce ramasse miettes fonctionne de manière périodique et
asynchrone à l’intérieur d’un fil d’exécution séparé de la
JVM. Il n’y a pas de garantie qu’un objet soit détruit. Il est
possible de déclencher le fonctionnement du ramasse miettes par l’appel à
la méthode de classeSystem.gc().
Christian Bac, Denis Conan, Télécom
SudParis, CSC 4002, Octobre 2015
|