Qu'est-ce que le ramasseur D'ordures à Java?

je suis nouveau à Java et confus au sujet du collecteur D'ordures à Java. Que faut-il réellement faire et quand il entre en action. Veuillez décrire certaines des propriétés du collecteur D'ordures en Java.

86
demandé sur NullUserException 2010-09-26 19:22:02

17 réponses

le collecteur de déchets est un programme qui tourne sur la machine virtuelle Java qui se débarrasse des objets qui ne sont plus utilisés par une application Java. C'est une forme de gestion automatique de la mémoire .

quand une application Java typique est en cours d'exécution, il crée de nouveaux objets, tels que String s et File s, mais après un certain temps, ces objets ne sont pas utilisés plus. 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 boucle for . Cela signifie qu'à chaque itération, un peu de mémoire allouée à faire un String objet.

en revenant au code, nous pouvons voir qu'une fois qu'une seule itération est exécutée, dans la prochaine itération, l'objet String qui a été créé dans le précédent l'itération n'est plus utilisée -- cet objet est maintenant considéré comme un "déchet".

finalement, nous allons commencer à recevoir beaucoup de déchets, et la mémoire sera utilisée pour les 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 éboueur intervient.

le éboueur va chercher des objets qui ne sont pas utilisés plus maintenant, et se débarrasse d'eux, libérant la mémoire pour que d'autres nouveaux objets puissent utiliser cette pièce de mémoire.

en Java, la gestion de la mémoire est prise en charge par le collecteur de déchets, mais dans d'autres langues comme le C, on doit effectuer la gestion de la mémoire sur leur propre en utilisant des fonctions telles que malloc et free . gestion de la mémoire est l'une de ces choses qui sont faciles à faire des erreurs, ce qui peut conduire à ce que sont appelés fuites de mémoire -- endroits où la mémoire n'est pas récupérée lorsqu'ils ne sont plus utilisés.

systèmes automatiques de gestion de la mémoire comme la collecte des ordures le rend donc le programmeur n'a pas à s'inquiéter tellement sur les questions de gestion de la mémoire, il ou elle peut se concentrer davantage sur le développement des applications dont ils ont besoin pour développer.

104
répondu coobird 2010-09-26 15:49:00

il libère la mémoire allouée aux objets qui ne sont plus utilisés par le programme - d'où le nom"garbage". 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 appelez otherMethod() l'original Object créé est rendu inaccessible - et c'est" ordures " qui obtient ordures collectées.

en Java, le GC s'exécute automatiquement, mais vous pouvez aussi l'appeler explicitement avec System.gc() et tenter "de 1519120920" force majeure la collecte des ordures. Comme Pascal Thivent le souligne, vous ne devriez pas vraiment 1519120920 " avoir à le faire et il pourrait faire plus de mal que de bien (voir cette question ).

pour plus, voir l'entrée Wikipédia sur collecte des ordures et collecte des ordures Tuning (D'Oracle)

18
répondu NullUserException 2017-05-23 12:26:32

un objet devient admissible à la collecte des ordures ou à la CG s'il n'est pas accessible à partir de fils conducteurs ou de références statiques.

en d'autres termes, vous pouvez dire qu'un objet devient admissible à la collecte des ordures si toutes ses références sont nulles. Les dépendances cycliques ne sont pas comptées comme référence, donc si l'objet A a une référence à l'objet B et l'objet B a une référence à L'objet A et ils n'ont pas d'autre référence en direct, alors les deux objets A et B seront être admissible à la collecte des ordures.


Tas de Générations pour la Collecte des Ordures ménagères -

objets Java sont créés dans Heap et Heap est divisé en trois parties ou générations pour le bien de la collecte des ordures en Java, ceux-ci sont appelés comme Jeune(nouvelle) génération, tenure(ancienne) génération et la zone de Perm du tas.

Java Heap Space Nouvelle Génération est en outre divisé en trois parties, connu comme l'Eden de l'espace, Survivant 1 et Survivant 2 de l'espace. Lorsqu'un objet créé en tas est créé en nouvelle génération à L'intérieur de L'Espace Eden et après une collecte des ordures mineure si un objet survit, il est transféré au survivant 1 puis au survivant 2 avant que la collecte des ordures principale ne déplace cet objet à ancien ou titulaire génération .

Perm espace de Java Heap est où JVM stocke les Métadonnées sur les classes et les méthodes de Cordes, la piscine et le niveau de la Classe de détails.

Heap Generations for Garbage Collection

reportez-vous ici pour plus d' : Garbage Collection


Vous ne pouvez pas forcer JVM pour exécuter la Collecte des Ordures si vous pouvez faites une demande en utilisant la méthode System.gc() ou Runtime.gc() .

En java.lang.Système

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

En java.lang.Runtime

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

algorithme de marquage et de balayage -

c'est l'un des algorithmes les plus populaires utilisés par Garbage collection. Tout algorithme de collecte des ordures doit effectuer 2 opérations de base. D'une part, il devrait être capable de détecter tous les objets inaccessibles et, d'autre part, il doit récupérer l'espace tas utilisé par les objets poubelles et rendre l'espace disponible de nouveau au programme.

les opérations ci-dessus sont effectuées par L'algorithme de marquage et de balayage en deux phases:

  1. Marque "de la phase 1519740920"
  2. Phase de balayage

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

9
répondu roottraveller 2017-11-09 13:41:13

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

6
répondu Nik 2010-09-26 15:26:36

collecteur D'ordures fait partie de JRE qui fait en sorte que l'objet qui ne sont pas référencés sera libéré de la mémoire.

Il fonctionne généralement lorsque votre application est à court 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 sauver la performance les objets courants groupés en générations, chaque fois que GC scanne un objet et trouve qu'il est encore référencé son compte de génération incrémenté par 1 (à une certaine valeur maximale, 3 ou 4 je pense), et la nouvelle génération sont balayés en premier (l'objet le plus court dans la mémoire plus probablement il n'est plus nécessaire) donc pas tous les objets étant balayés chaque fois que GC exécute.

lire ce pour plus d'informations.

6
répondu Itay Karo 2010-09-26 15:31:59

le collecteur d'ordures permet à votre ordinateur de simuler un ordinateur avec une mémoire infinie. le reste n'est qu'un mécanisme.

il le fait en détectant quand des morceaux de mémoire ne sont plus accessibles à partir de votre code, et en retournant ces morceaux au magasin libre.

EDIT: Oui, le lien est pour C#, mais C# et Java sont identiques à cet égard.

3
répondu Billy ONeal 2010-09-26 15:34:50

beaucoup de gens pensent que la collecte des ordures recueille et élimine les objets morts.

En réalité, Java garbage collection fait le contraire! Les objets vivants sont traqués et tout le reste est considéré comme des déchets.

Lorsqu'un objet n'est plus utilisé, le collecteur d'ordures récupère la mémoire sous-jacente et la réutilise pour une affectation future. Cela signifie qu'il n'y est pas explicite suppression et aucune mémoire n'est donnée sur le système d'exploitation. De déterminez quels objets ne sont plus utilisés, la JVM exécute par intermittence ce qu'on appelle très justement un algorithme de pointage et de balayage.

vérifier cette information pour plus de détails: http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

3
répondu VedX 2014-09-05 09:47:15

ramassage de déchets en Java (et d'autres langues/plates-formes aussi) est un moyen pour l'environnement java run-time (JRE) de réutiliser la mémoire des objets java qui ne sont plus nécessaires. De façon simpliste, lorsque le JRE démarre, il demande au système D'exploitation (O/S) une certaine quantité de mémoire. Lorsque le JRE exécute votre(Vos) application (s), il utilise cette mémoire. Quand votre application est faite en utilisant cette mémoire, le "collecteur de déchets" de JRE vient et réclame que la mémoire à utiliser par les différentes parties de votre application existante(s). Le "collecteur D'ordures" de la JRE est une tâche de fond qui est toujours en cours d'exécution et tente de choisir les moments où le système est inactif pour aller sur ses parcours d'ordures.

une analogie du monde réel serait les éboueurs qui viennent chez vous et ramassent vos déchets recyclables... finalement, son réutilisé dans d'autres façons, par vous-même et/ou d'autres personnes.

0
répondu Al Dass 2010-09-26 15:45:31

collecteur D'ordures peut être considéré comme un gestionnaire de comptage de référence. si un objet est créé et que sa référence est stockée dans une variable, son nombre de référence est augmenté d'un. au cours de l'exécution si cette variable est assignée avec NULL. le compte de référence pour cet objet est décrémenté. donc le compte de référence courant pour l'objet est 0. Maintenant quand le collecteur D'ordures est exécuté, il vérifie pour les objets avec le compte de référence 0. et libère les ressources qui lui sont allouées.

L'invocation par un éboueur est contrôlée par les politiques de collecte des ordures.

vous pouvez obtenir des données ici. http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

0
répondu bala sreekanth 2010-09-26 15:51:28

collecteur D'ordures est une composante de jvm.

il est utilisé pour ramasser les ordures quand jamais cpu obtient libre.

ici déchets signifie objets inutilisés il exécute en arrière-plan du programme principal

pour surveiller l'état du programme principal.

0
répondu Pulipati Prasadarao 2014-09-20 14:05:58

la collecte automatique des ordures est le processus qui consiste à examiner la mémoire tas, à identifier les objets utilisés et ceux qui ne le sont pas, et à supprimer les objets inutilisés. Une utilisation objet, ou un objet référencé, signifie qu'une certaine partie de votre programme conserve un pointeur vers cet objet. Un objet non utilisé, ou un objet non référencé, n'est plus référencé par aucune partie de votre programme. Si la mémoire utilisée par l'objet non référencé peut être récupérée.

dans une programmation un langage comme C, allouer et désallouer la mémoire est un processus manuel. En Java, le processus de désallocation de la mémoire est géré automatiquement par le collecteur de déchets. Veuillez vérifier le lien pour une meilleure compréhension. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

0
répondu Shashank Shankaranand 2017-02-22 00:15:37

collecte des ordures se réfère au processus de libération automatique de la mémoire sur le tas en supprimant les objets qui ne sont plus accessibles dans votre programme. Le tas est une mémoire qui est appelé le free store, représente un grand réservoir de mémoire inutilisée alloué à votre application Java.

0
répondu Aamir Meman 2017-04-16 09:48:08

Les principes de base de la collecte des ordures est de trouver des objets de données dans un programme qui ne peut pas être consulté à l'avenir, et pour récupérer les ressources utilisées par ces objets. https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

avantages

1) sauve des bugs, qui se produisent quand un morceau de mémoire est libéré alors qu'il ya encore des pointeurs vers elle, et l'un de ces les pointeurs est déréférencé. https://en.wikipedia.org/wiki/Dangling_pointer

2) double bugs libres, qui se produisent lorsque le programme essaie de libérer une région de mémoire qui a déjà été libérée, et peut-être déjà attribuée à nouveau.

3) prévient de certains types de fuites de mémoire, dans lequel un programme ne parvient pas à libérer la mémoire occupée par des objets qui sont devenus inaccessibles, ce qui peut conduire à l'épuisement de la mémoire.

désavantages

1) La consommation de ressources supplémentaires, les répercussions sur le rendement, les retards possibles dans l'exécution du programme et l'incompatibilité avec la gestion manuelle des ressources. Le ramassage des ordures consomme des ressources informatiques pour décider quelle mémoire libérer, même si le programmeur a peut-être déjà connu cette information.

2) le moment où les ordures sont effectivement ramassées peut être imprévisible, ce qui entraîne des décrochages (pauses à shift/mémoire libre) dispersées au cours d'une session. Les décrochages imprévisibles peuvent être inacceptables dans les environnements en temps réel, dans le traitement des transactions ou dans les programmes interactifs.


Oracle tutorial http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

la collecte des ordures est le processus permettant d'identifier les objets utilisés et ceux qui ne le sont pas., et supprimer les objets inutilisés.

dans un langage de programmation comme C, C++, allouer et libérer la mémoire est un processus manuel.

int * array = new int[size];
processArray(array); //do some work.
delete array; //Free memory

la première étape du processus s'appelle le marquage. C'est là que le ramasseur d'ordures identifie les pièces de mémoire utilisées et celles qui ne le sont pas.

étape 2a. Suppression normale supprime les objets non référencés en laissant les objets référencés et les pointeurs pour libérer de l'espace.

pour améliorer les performances, nous voulons supprimer les objets non référencés et aussi compacter les autres objets référencés. Nous voulons garder les objets référencés ensemble, de sorte qu'il sera plus rapide d'allouer une nouvelle mémoire.

comme indiqué plus haut, le fait d'avoir à marquer et à compacter tous les objets d'une JVM est inefficace. Au fur et à mesure que de plus en plus d'objets sont attribués, la liste des objets s'allonge et conduit de plus en plus à la collecte des ordures temps.

continuez à lire ce tutoriel, et vous saurez comment GC relève ce défi.

En bref, il y a trois régions du tas, YoungGeneration objets de la vie, OldGeneration pour une longue période objets, et PermanentGeneration pour les objets qui vivent au cours de la vie de l'application, par exemple, les classes, les bibliothèques.

0
répondu Yan Khonski 2017-06-23 12:28:02

comme les objets sont alloués dynamiquement par l'opérateur nouveau , vous pouvez vous demander comment ces objets sont détruits et comment la mémoire chargée est libérée. Dans d'autres langages comme C++, vous devez libérer les objets alloués manuellement de manière dynamique par l'opérateur delete. Java a une approche différente; gère automatiquement la désallocation. Cette technique est connue sous le nom de " Garbage Collection " ".

ça marche comme ça: quand il n'y a pas de références pour un objet, il est supposé que cet objet n'est plus nécessaire et vous pouvez récupérer de la mémoire occupée par l'objet. Il n'est pas nécessaire de détruire explicitement des objets comme en C ++. La collecte des ordures se produit sporadiquement pendant l'exécution du programme; elle ne se produit pas simplement parce qu'il y a un ou plusieurs objets qui ne sont plus utilisés. En outre, plusieurs implémentations Java runtime ont différentes approches de collecte des déchets, mais la plupart des programmeurs n'ont pas à se soucier d'écrire programmes

0
répondu Amarildo 2017-07-02 20:30:08

un objet devient admissible à la collecte des ordures ou à la CG s'il n'est pas accessible à partir de fils conducteurs ou de références statiques.

en d'autres termes, vous pouvez dire qu'un objet devient admissible à la collecte des ordures si toutes ses références sont nulles. Les dépendances cycliques ne sont pas comptées comme référence, donc si l'objet A a une référence à l'objet B et l'objet B a une référence à L'objet A et ils n'ont pas d'autre référence en direct, alors les deux objets A et B seront être admissible à la collecte des ordures.


Tas de Générations pour la Collecte des Ordures ménagères -

objets Java sont créés dans Heap et Heap est divisé en trois parties ou générations pour le bien de la collecte des ordures en Java, ceux-ci sont appelés comme Jeune(nouvelle) génération, titulaire(ancienne) génération et la zone de Perm du tas.

Java Heap Space Nouvelle Génération est en outre divisé en trois parties, connu comme l'Eden de l'espace, Survivant 1 et Survivant 2 de l'espace. Lorsqu'un objet créé pour la première fois dans un tas est créé pour la nouvelle génération à L'intérieur de L'Espace Eden et après une collecte des ordures mineure si un objet survit, il est transféré au survivant 1 puis au survivant 2 avant que la collecte des ordures majeure ne déplace cet objet à ancien ou titulaire génération .

Perm space de Java Heap est L'endroit où JVM stocke les métadonnées sur les classes et les méthodes, le pool de chaînes et les détails sur le niveau des classes.

Heap Generations for Garbage Collection

0
répondu roottraveller 2017-07-10 10:23:20

pour le mettre dans les termes les plus simples que même un non-programmeur peut comprendre, quand un programme traite des données il crée des données intermédiaires et de l'espace de stockage (variables, tableaux, certaines métadonnées d'objet etc.) pour que les données.

lorsque ces objets sont accessibles à travers des fonctions ou sur une certaine taille, ils sont alloués à partir d'un tas central. Puis quand ils ne sont plus nécessaires, ils doivent être nettoyés.

il y en a de très bons articles en ligne sur la façon dont cela fonctionne, donc je vais juste couvrir la définition de base.

le CG est essentiellement la fonction qui effectue ce nettoyage. Pour ce faire, il efface les entrées de table qui ne sont référencées par aucun objet actif, effaçant effectivement les objets, que copie et compacte la mémoire. C'est un peu plus compliqué que cela, mais vous obtenez l'idée.

le gros problème est que certaines parties de ce processus nécessitent souvent toute la VM Java pour besoin d'être temporairement arrêté pour avoir lieu, ainsi que l'ensemble de ce processus étant très processeur et de la bande passante mémoire intensive. Les diverses options de SCG et les options de réglage pour chacune d'elles sont conçues pour équilibrer ces diverses questions avec l'ensemble du processus du GC.

0
répondu Robert Wm Ruedisueli 2018-08-04 01:56:03

collecte automatique des ordures est un processus par lequel la JVM se débarrasse de ou garde certains points de données en mémoire pour finalement libérer de l'espace pour le programme courant. La mémoire est d'abord envoyée à la mémoire tas, c'est-à-dire à L'endroit où le collecteur d'ordures (CG) fait son travail, puis il est décidé d'y mettre fin ou de la conserver. Java suppose que le programmeur ne peut pas toujours être fiable, de sorte qu'il termine les éléments dont il pense qu'il n'a pas besoin.

-2
répondu Lopes_CP_2579 2015-09-30 17:40:35