112 votes

Qu'est-ce que le garbage collector en Java ?

Je suis nouveau dans le monde de Java et je ne sais pas comment fonctionne le ramasseur de déchets dans Java. Que fait-il réellement et quand entre-t-il en action ? Veuillez décrire certaines des propriétés du ramasseur de déchets en Java.

2 votes

Duplicata possible de Collecte des ordures

12 votes

Parfois, il vaut mieux lire un chapitre d'un bon livre que de comprendre un sujet complexe à partir de la réponse à une question.

4 votes

@Ian C'est une question similaire, mais pas un doublon. Et cette question pue de devoirs.

130voto

coobird Points 70356

El éboueur est un programme qui fonctionne sur le Machine virtuelle Java qui se débarrasse des objets qui ne sont plus utilisés par une application Java. Il s'agit d'une forme de gestion automatique de la mémoire .

Lorsqu'une application Java typique est en cours d'exécution, elle crée de nouveaux objets, tels que les suivants String et File mais après un certain temps, ces objets ne sont plus utilisés. Par exemple, regardez le code suivant :

for (File f : files) {
    String s = f.getName();
}

Dans le code ci-dessus, le String s est créé à chaque itération de la for boucle. Cela signifie qu'à chaque itération, un petit peu de mémoire est allouée pour faire une String objet.

En revenant au code, nous pouvons voir qu'une fois qu'une seule itération est exécutée, dans l'itération suivante, l'élément String L'objet qui a été créé lors de l'itération précédente n'est plus utilisé - cet objet est maintenant considéré comme une "poubelle".

Au bout d'un certain temps, il y aura beaucoup de déchets, et la mémoire sera utilisée pour des objets qui ne sont plus utilisés. Si cela continue, la machine virtuelle Java finira par manquer d'espace pour créer de nouveaux objets.

C'est là que le ramasseur de déchets intervient.

Le collecteur d'ordures recherche les objets qui ne sont plus utilisés et s'en débarrasse, libérant ainsi la mémoire pour que de nouveaux objets puissent utiliser cette partie de la mémoire.

En Java, la gestion de la mémoire est prise en charge par le ramasseur de déchets, mais dans d'autres langages comme le C, il faut effectuer soi-même la gestion de la mémoire à l'aide de fonctions telles que malloc y free . Gestion de la mémoire est l'une de ces choses où il est facile de faire des erreurs, qui peuvent conduire à ce que l'on appelle fuites de mémoire -- des endroits où la mémoire n'est pas récupérée lorsqu'ils ne sont plus utilisés.

Les systèmes de gestion automatique de la mémoire, comme le ramassage des déchets, permettent au programmeur de ne pas avoir à se préoccuper autant des questions de gestion de la mémoire, ce qui lui permet de se concentrer davantage sur le développement des applications qu'il doit développer.

0 votes

Serait-il vrai de dire qu'une application Java s'exécutant sur un ordinateur possède deux fonctions de collecte des déchets. Une avec la machine virtuelle Java. Et une autre sur la machine réelle qui exécute Windows ? (Ou tout autre système d'exploitation)

0 votes

Non, en général, les applications Java ne fonctionnent que si le JRE est présent. Ainsi, seule la fonctionnalité de collecte des déchets de la JVM est nécessaire ! @Lealo

21voto

NullUserException Points 42268

Il libère la mémoire allouée aux objets qui ne sont plus utilisés par le programme - d'où le nom de "poubelle". Par exemple :

public static Object otherMethod(Object obj) {
    return new Object();
}

public static void main(String[] args) {
    Object myObj = new Object();
    myObj = otherMethod(myObj);
    // ... more code ...  
}

Je sais que c'est extrêmement artificiel, mais ici après que vous ayez appelé otherMethod() l'original Object créé est rendu inaccessible - et ce sont des "déchets" qui sont ramassés.

En Java, le GC s'exécute automatiquement, mais vous pouvez aussi l'appeler explicitement avec [System.gc()](http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#gc()) y essayer de forcer une importante collecte de déchets. Comme le souligne Pascal Thivent, il faut vraiment ne devrait pas doivent le faire et cela pourrait faire plus de mal que de bien (cf. cette question ).

Pour en savoir plus, voir l'entrée de wikipedia sur Collecte des déchets y Tuning Garbage Collection (d'après Oracle)

1 votes

AFAIK System.gc() ne force pas GC à s'exécuter.

1 votes

+1 pour le bon exemple de code. Notez qu'il est parfaitement valide pour le GC de détruire myObj avant l'appel à otherMethod a lieu, car myObj n'est plus accessible à ce moment-là.

0 votes

@Italy Je crois que c'est spécifique à l'implémentation.

20voto

roottraveller Points 4532

Un objet devient éligible à la collecte d'ordures ou GC s'il n'est pas accessible à partir d'un thread vivant ou par des références statiques.

En d'autres termes, on peut dire qu'un objet devient éligible à la collecte des déchets si toutes ses références sont nulles. Les dépendances cycliques ne sont pas comptées comme des références. Ainsi, si l'objet A a une référence à l'objet B et que l'objet B a une référence à l'objet A et qu'ils n'ont aucune autre référence vivante, les deux objets A et B seront éligibles pour la collecte des déchets.


Générations de tas pour la collecte d'ordures -

Les objets Java sont créés dans Heap y Heap est divisé en trois parties ou générations pour les besoins du ramassage des déchets en Java, qui sont appelées Jeune (nouvelle) génération, ancienne (ancienne) génération et zone de Perm du tas.

Java Heap Space Nouvelle génération est divisé en trois parties : l'espace Eden, l'espace Survivant 1 et l'espace Survivant 2. Lorsqu'un objet est créé pour la première fois dans le tas, il est créé dans une nouvelle génération à l'intérieur de l'espace Eden et après une collecte mineure subséquente, si l'objet survit, il est déplacé vers le survivant 1, puis vers le survivant 2 avant la collecte majeure. génération ancienne ou titulaire .

Espace perm Le tas de Java est l'endroit où la JVM stocke les métadonnées sur les classes et les méthodes, le pool de chaînes et les détails au niveau des classes.

Heap Generations for Garbage Collection

Voir ici pour plus d'informations : Collecte des ordures


Vous ne pouvez pas forcer la JVM à lancer le Garbage Collection, mais vous pouvez faire une demande en utilisant la commande System.gc() o Runtime.gc() méthode.

Dans java.lang.System

public static void gc() {
    Runtime.getRuntime().gc();  
}

Dans java.lang.Runtime

public native void gc();  // note native  method

Algorithme de marquage et de balayage -

Il s'agit de l'un des algorithmes les plus populaires utilisés par le Garbage Collection. Tout algorithme de ramassage des ordures doit effectuer deux opérations de base. Premièrement, il doit être capable de détecter tous les objets inaccessibles et deuxièmement, il doit récupérer l'espace du tas utilisé par les objets poubelles et rendre l'espace à nouveau disponible pour le programme.

Les opérations ci-dessus sont effectuées par l'algorithme Mark and Sweep en deux phases :

  1. Phase de marquage
  2. Phase de balayage

lire ici pour plus de détails - Algorithme de marquage et de balayage

6voto

Nik Points 1832

Le collecteur d'ordures implique que les objets qui ne sont plus nécessaires au programme sont des "ordures" et peuvent être jetés.

6voto

Itay Karo Points 10446

Le collecteur d'ordures fait partie du JRE qui s'assure que les objets qui ne sont pas référencés seront libérés de la mémoire.
Il s'exécute généralement lorsque l'application manque de mémoire. AFAIK il contient un graphique qui représente les liens entre les objets et les objets isolés peuvent être libérés.
Pour économiser de la performance, les objets actuels sont groupés en générations, chaque fois que la GC scanne un objet et trouve qu'il est toujours référencé, son nombre de générations est incrémenté de 1 (jusqu'à une valeur maximale, 3 ou 4 je pense), et la nouvelle génération est scannée en premier (plus l'objet est court en mémoire, plus il est probable qu'il n'est plus nécessaire) donc tous les objets ne sont pas scannés à chaque fois que la GC est lancée.
lire este pour plus d'informations.

0 votes

@quantumSoup êtes-vous possitif à ce sujet ? Je crois qu'une sorte de garbage collection (plus coûteuse) ne se produit que lorsque le tas se remplit.

2 votes

@quantumSoup - cela dépend de l'implémentation de la GC du JRE. Dans de nombreux cas, le GC n'est pas fonctionnent constamment. Au lieu de cela, il s'exécute lorsque votre application est incapable d'allouer un objet parce que le tas est plein. Les JVM récentes de HotSpot comprennent une GC parallèle, mais elle n'est pas activée par défaut.

0 votes

Cette réponse se concentre trop sur le mécanisme. La question était "Qu'est-ce que le garbage collector", et non "Comment fonctionne le garbage collector".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X