Ligne de comportement du garbage collector (récupérateur de mémoire)
Le programmeur Java n'a pas besoin de surveiller l'allocation de mémoire car le garbage collector gère automatiquement la mémoire. Le Garbage Collector est exécuté par la machine virtuelle Java (JVM). Le garbage collector est un processus de faible priorité qui s'exécute périodiquement et libère la mémoire utilisée par les objets qui ne sont plus nécessaires. Différentes JVM ont différents algorithmes de garbage collection. Plusieurs algorithmes sont utilisés, par exemple : l'algorithme de comptage de références ou les algorithmes de balisage et de scraping.
Exécuter le garbage collector en Java
La JVM exécute généralement le garbage collector lorsque la mémoire libre est faible. Mais le fonctionnement du garbage collector ne garantit pas qu'il y aura toujours suffisamment de mémoire libre. S'il n'y a pas assez de mémoire même après la récupération, la JVM génère une exception OutOfMemoryError. Veuillez noter que la JVM doit exécuter le garbage collector au moins une fois avant de lever une exception. Vous pouvez demander au garbage collector de s'exécuter en Java, mais vous ne pouvez pas forcer cette action.
Demande d'exécution du garbage collector
Pour faire une requête, vous pouvez appeler l'une des méthodes suivantes :
System.gc()
Runtime.getRuntime().gc()
Aptitude à exécuter un ramasse-miettes
Un objet doit être éliminé lorsqu'il n'est plus disponible pour le flux vivant. Un objet peut faire l'objet d'une cession dans différents cas :
- Si une variable d'un type référence qui fait référence à un objet est définie sur "0", l'objet doit être supprimé s'il n'y a aucune autre référence à lui.
- Si une variable d'un type référence qui fait référence à un objet est créée pour faire référence à un autre objet, l'objet doit être supprimé s'il n'y a aucune autre référence à lui.
- Les objets créés localement dans une méthode sont supprimés à la sortie de la méthode, à moins qu'ils ne soient exportés à partir de cette méthode (c'est-à-dire renvoyés ou lancés en tant qu'exception).
- Les objets qui se référencent les uns les autres peuvent être sujets à suppression si aucun d'entre eux n'est disponible pour le thread en direct.
Regardons un exemple :
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
Dans cet exemple
Integer
, l'objet (entier) initialement référencé par o1 peut être supprimé après la ligne 3 car o1 fait désormais référence à l'objet
String
(chaîne). Même si o2 est créé pour faire référence à null, l'objet
String
(chaîne) n'est pas recyclable puisque o1 y fait référence.
Finalisation
La technologie Java vous permet d'utiliser une méthode
finalize()
(finalize) pour effectuer le nettoyage nécessaire avant que le ramasse-miettes récupère un objet de la mémoire. Cette méthode est appelée sur un objet par le garbage collector lorsque celui-ci détermine qu'il n'y a plus de références à l'objet. Ceci est décrit dans la classe
Object
, ce qui signifie qu'il est hérité par toutes les classes. La sous-classe remplace la méthode
finalize()
pour se libérer des ressources système ou pour un autre nettoyage :
protected void finalize() throws Throwable
Si une exception non enregistrée est levée par la méthode
finalize()
, l'exception est ignorée et la finalisation de cet objet s'arrête. La méthode
finalize()
ne sera invoquée qu'une seule fois pendant la durée de vie de l'objet. Il est possible d’utiliser une méthode
finalize()
sur n’importe quel objet pour le protéger de son élimination. Mais dans ce cas, le garbage collector n’est plus activé
finalize()
pour cet objet. La méthode
finalize()
sera toujours invoquée une fois avant que l'objet ne soit récupéré. Il est cependant possible que la méthode
finalize()
ne soit pas activée pour un objet donné pendant toute la durée de son existence, puisqu'il ne peut pas faire l'objet d'une élimination.
Résumé
Dans cette section, nous avons examiné le processus de garbage collection, qui est une technique de gestion de la mémoire dans le langage Java. La collecte des déchets ne peut pas être forcée. Nous avons découvert les différentes manières de rendre les objets éligibles au recyclage et appris que la méthode
finalize()
est invoquée avant que l'objet ne soit récupéré par le garbage collector.
Exercice
Question : Combien d'objets seront sujets à élimination après la ligne 7 ?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
Options de réponse : A. 0 B. 1 C. 2 D. 3 E. Le code ne peut pas être compilé
Option correcte : B
Explication : Des trois objets créés aux lignes 1, 2 et 3, seul l'objet
Integer
doit être éliminé à la fin de la ligne 7. Les références de variables, a, qui faisaient initialement référence à l'objet
Integer
, font référence à l'objet
String
sur la ligne 5. Ainsi,
Integer
l'objet doit être supprimé après la ligne 5, car aucune variable ne le référence. Les variables
b
et
c
font référence aux objets
String
et
Long
aux objets des lignes 6 et 7, ils ne sont donc pas recyclables.
GO TO FULL VERSION