JavaRush /Blog Java /Random-FR /Récupérateur de place en Java
Diana
Niveau 41

Récupérateur de place en Java

Publié dans le groupe Random-FR

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.Collecte des déchets - 1

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);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
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);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
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 Integerdoit ê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 Stringsur la ligne 5. Ainsi, Integerl'objet doit être supprimé après la ligne 5, car aucune variable ne le référence. Les variables bet cfont référence aux objets Stringet Longaux objets des lignes 6 et 7, ils ne sont donc pas recyclables.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION