|
|
|
|
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... |
|
|
|
|
|
Quand achetez-vous le plus en ligne ? |
|
|
|
|
|
|
|
|