TUTORIEL DECRYPTAGE 
Expliquez-moi... Le ramasse-miettes Java
Les principes de base du Garbage Collector, élement essentiel de la machine virtuelle Java. (27/05/2005)
Java est un langage Objet : un programme répond à un modèle correspondant à une entité tangible dans le "monde réel". Ces objets sont chargés en mémoire et utilisés au besoin. Une fois que l'environnement Java a déterminé que l'objet n'était plus utile, le ramasse-miettes (en anglais, garbage collector) libère la mémoire qu'ils occupent. L'avantage est immense par rapport aux langages plus anciens, où le développeur devait connaître à tout instant ce qui se trouvait dans la mémoire, et gérer de manière efficace sa libération.

Cela n'est cependant pas spécifique au langage lui-même, mais à sa machine virtuelle (JVM) : c'est elle qui prend en charge ces aspects de la mémoire, et non le langage Java en tant que tel. Ainsi, il serait fort possible à l'avenir qu'une JVM ne comporte pas de ramasse-miettes - quand bien même la spécification de la JVM recommande son existence. Le ramasse-miettes est aujourd'hui heureusement la norme.

La JVM met en place du programme Java tout un environnement qui lui permet de tourner sur la machine comme si le programme était écrit en langage natif. Parmi cet environnement se trouve le mécanisme du ramasse-miettes, relativement indépendant du programme et fonctionnant selon deux modes : syncrone ou asyncrone. Il s'exécute le plus souvent en parallèle, mais reste à la disposition du développeur si celui-ci estime que son lancement est opportun.

L'objectif du ramasse-miettes est donc de récupérer la mémoire non utilisée, ou plus précisément d'en retirer les objets qui ne sont plus utilisés, ou qui ne sont plus accessibles. En plus de cela, il tente de compacter la mémoire disponible, de la même manière qu'un disque dur doit être réorganisé de temps à autre pour fonctionner au maximum de ses capacités. Le problème est donc d'identifier les objets devenus inutiles. Cela se fait en repérant les objets vers lesquels d'autres objets pointent, à les marquer comme étant accessibles, et à s'occuper ensuite des autres objets, logiquement inaccessibles, qui seront libérés au prochain passage. Il marque les objets en continu, de manière asynchrone, et les efface/compacte de manière synchrone.

Le mode synchrone se lance le plus souvent quand l'application a besoin de plus de mémoire que celle actuellement disponible. Il est également possible de le lancer explicitement, de la manière suivante :

Runtime r = Runtime.getRuntime();
r.gc();


L'objet Runtime permet d'agir sur l'environnement de l'application. La méthode gc() lance le ramasse-miettes, tout simplement.

Pour qu'un objet soit rapidement évincé , il faut déréférencer l'objet (vider son identifiant) :
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
br = null;


  Forum

Réagissez dans les forums de JDN Développeurs

Il est également possible d'exploiter la méthode finalize() de tout objet, qui est l'équivalent "fin de vie" des initialisateurs de l'objet. Rien de tout ceci ne peut cependant garantir que tous les objets inutiles seront effacés prestement de la mémoire...
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages