Maison  >  Article  >  Java  >  Partager le résumé de l'apprentissage du mécanisme de récupération de place Java

Partager le résumé de l'apprentissage du mécanisme de récupération de place Java

高洛峰
高洛峰original
2017-03-09 19:00:311199parcourir

Cet article partage un résumé de l'apprentissage du mécanisme de récupération de place Java

Fuite de mémoire : Une fuite de mémoire signifie que l'espace mémoire n'est pas recyclé après son utilisation. De manière générale, les fuites de mémoire en Java sont dues au fait que le cycle de vie de l'objet mémoire dépasse la durée pendant laquelle il existe dans le programme.

Le sens du garbage collection : résoudre les problèmes de gestion de la mémoire qui doivent être pris en compte lors de la programmation. , et résolvez efficacement le problème des fuites de mémoire, utilisez pleinement l'espace mémoire libre. Les objets Java n'ont plus la notion de portée, seules les références aux objets ont une portée.

Opérations de base  : (1) Découvrez les objets inutiles ; (2) Recyclez l'espace occupé par les objets inutiles et libérez-le dans un espace que le programme peut réutiliser.

Heure du recyclage  : L'heure précise à laquelle a lieu la collecte des déchets est imprévisible. De manière générale, il existe deux possibilités :

.

Le programmeur appelle l'interface GC de la JVM, mais informe uniquement le système qu'il souhaite effectuer un garbage collection. L'heure spécifique est déterminée par le système

Lorsque le programme est en cours d'exécution, s'il est volumineux ; Un bloc de mémoire est nécessaire, il ne peut pas en fournir suffisamment pour le moment. Si le bloc est volumineux, le système appellera GC pour le garbage collection.

Algorithme de recyclage :

Méthode de comptage de références

Contenu : Chaque objet est créé Lorsque le instance d'objet est affectée à une variable (appelée compteur de référence), la valeur initiale du nombre de variables est définie sur 1. Lorsque l'objet est référencé, la valeur du compte est augmentée de 1. Lorsqu'une référence d'une instance d'objet dépasse la durée de vie cycle ou est Lorsqu'il est réglé sur une autre valeur, le compteur de référence est décrémenté de 1. Lorsque la valeur du compteur de référence atteint 0, elle peut être récupérée. (Remarque : Cette instance d'objet peut également faire référence à d'autres objets, donc lorsque l'objet est recyclé, les compteurs de tous les objets auxquels il fait référence seront réduits de 1.)

Évaluation : Peut être exécuté plus rapidement, en réel temps C'est plus pratique dans le cadre du système, mais cela ne peut pas résoudre le problème de référence circulaire. Par exemple, l'objet a et l'objet b font référence l'un à l'autre, mais les valeurs de a et b sont attribuées à null. À ce stade, les objets référencés par a et b ne sont plus accessibles, mais ils font référence à. les uns les autres, ce qui fait que la valeur de leur compteur de référence est différente de 0. À ce stade, le GC ne les récupérera jamais.

Algorithme de recherche racine

Contenu : traiter toutes les relations de référence dans le programme comme un graphe, partir du nœud racine GC Root object, trouver le nœud correspondant à la référence , et ainsi de suite, tous les nœuds de référence forment un graphe et les nœuds restants sont considérés comme des nœuds non référencés, c'est-à-dire des nœuds inutiles.

Les objets utilisés comme objets racine GC en Java sont : les objets référencés dans la pile de machines virtuelles Java, les objets référencés par des propriétés statiques dans la zone de méthode, les objets référencés par des constantes dans la zone de méthode et les objets référencés dans la zone de méthode. pile de méthodes locales

Algorithme Mark-Clear

Contenu : analysez à partir de la collection racine, marquez les objets survivants, puis analysez les objets non marqués pour les recycler après toutes les analyses.

Évaluation : Pas besoin de déplacer les objets, seuls les objets non survivants sont traités. C'est plus efficace lorsqu'il y a de nombreux objets survivants, mais cela entraînera une fragmentation de la mémoire.

Algorithme d'organisation de marque

Contenu : Basé sur l'algorithme 3, après avoir recyclé les objets inutiles, tous les objets survivants seront déplacés vers l'espace libre pour organiser la mémoire libre.

Évaluation : Les frais généraux augmentent, mais le problème de fragmentation est résolu.

Remarque : les algorithmes 3, 4 et 5 appartiennent tous à des algorithmes de recherche racine et sont décrits séparément ici pour faciliter la compréhension.

algorithme de copie

Contenu : divisez la mémoire en zone d'objet et zone libre, scannez la zone d'objet, puis copiez tous les nœuds valides dans la zone d'objet dans Séquence vers la zone libre et libération de la zone de l'objet d'origine. À ce moment, la zone de l'objet d'origine devient la zone libre. La collecte des déchets est terminée lors du basculement entre la zone objet et la zone libre.

Évaluation : le recyclage des poignées est réduit et la fragmentation ne se produira pas, mais le programme doit être mis en pause pendant le processus de commutation.

L'algorithme de génération

est utilisé pour stocker des fichiers statiques, tels que des classes Java, des méthodes, etc. La génération persistante n'a pas d'impact significatif sur le garbage collection

Les objets qui survivent encore après N garbage collection dans la jeune génération seront placés dans l'ancienne génération. On peut donc considérer que l’ancienne génération stocke des objets ayant des cycles de vie longs.

La mémoire est beaucoup plus grande que celle de la nouvelle génération (le rapport est probablement de 1:2). Lorsque la mémoire de l'ancienne génération est pleine, le Major GC est déclenché, c'est-à-dire Full GC La fréquence de Full. Le GC est relativement faible et la durée de survie des objets de l'ancienne génération est relativement longue. Le taux de survie est élevé.

Tous les objets nouvellement générés sont d'abord placés dans la jeune génération. L’objectif de la jeune génération est de collectionner le plus rapidement possible des objets à cycle de vie court.

La mémoire de nouvelle génération est divisée en une zone Eden et deux zones survivant (survivor0, survivant1) dans un rapport de 8:1:1. Une zone Eden et deux zones Survivant (en général). La plupart des objets sont générés dans la zone Eden. Lors du recyclage, copiez d'abord les objets survivants de la zone eden dans une zone survivant0, puis videz la zone eden0 est également pleine, copiez les objets survivants de la zone eden et de la zone survivant0 dans une autre zone survivant1, puis. dégagez Eden et cette zone. Dans la zone survivant0, la zone survivant0 est vide à ce moment, puis la zone survivant0 et la zone survivant1 sont échangées, c'est-à-dire que la zone survivant1 reste vide, et ainsi de suite.

Lorsque la zone survivant1 n'est pas suffisante pour stocker les objets survivants d'eden et survivant0, les objets survivants sont directement stockés dans l'ancienne génération. Si l'ancienne génération est également pleine, un Full GC sera déclenché, c'est-à-dire que la nouvelle génération et l'ancienne génération seront recyclées

Le GC qui se produit dans la nouvelle génération est également appelé Minor GC. la fréquence des GC mineurs est relativement élevée (pas nécessairement dans la zone Eden).

Contenu : En fonction des différents cycles de vie des différents objets, les objets sont traités en générations. (divisée en trois générations : nouvelle génération, ancienne génération et génération persistante).

Nouvelle génération :

Ancienne génération :

Génération persistante :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn