Le mécanisme de garbage collection de jvm est GC (Garbage Collection), également appelé garbage collector. Principes de base du GC?: recyclez les objets qui ne sont plus utilisés en mémoire?; la méthode utilisée pour le recyclage dans le GC est appelée le collecteur. étant donné que le GC nécessite des ressources et du temps, Java analyse les caractéristiques du cycle de vie de l'objet et utilise les objets. collectés dans la nouvelle génération et l’ancienne génération pour raccourcir autant que possible la pause provoquée par GC dans l’application.
L'environnement d'exploitation de ce tutoriel : système windows7, version java8, ordinateur DELL G3.
Qu'est-ce que le garbage collection
L'un des avantages de Java par rapport aux langages C et C++ est qu'il est livré avec un garbage collector. Le garbage collection fait référence au nettoyage des objets inaccessibles dans la mémoire tas de temps en temps. Les objets inaccessibles ne seront pas recyclés immédiatement. L'exécution du garbage collector dans un programme Java est automatique et ne peut pas être forcée. La seule chose que le programmeur peut faire est de suggérer l'exécution du garbage collector en appelant la méthode System.gc. mais on ne sait pas s’il peut être exécuté et quand il le sera. C’est aussi le principal inconvénient du garbage collector. Bien entendu, cette lacune est compensée par la grande commodité qu’elle apporte aux programmeurs.
Pourquoi le garbage collection est nécessaire
Si le garbage collection n'est pas effectué, la mémoire sera consommée t?t ou tard car nous allouons constamment de l'espace mémoire sans le recycler. A moins que la mémoire ne soit infinie, on peut l’allouer arbitrairement sans la recycler, mais ce n’est pas le cas. La collecte des déchets est donc nécessaire.
Principe du garbage collection jvm
Il y a une zone de tas dans la zone de données d'exécution de la JVM, et le tas est un énorme pool d'objets. Un grand nombre d'instances d'objets sont gérées dans ce pool d'objets, et certains des niveaux de référence des objets du pool sont très profonds. Une interface fréquemment appelée génère des objets à un rythme très élevé par seconde. Dans le même temps, la relation entre les objets forme un immense réseau.
Java a créé une atmosphère de mémoire infinie, mais les objets ne peuvent pas seulement augmenter sans diminuer, donc le garbage collection est nécessaire?; alors comment la JVM détermine-t-elle quels objets doivent être recyclés?? Lesquels faut-il conserver ? Cela nécessite l'utilisation du mécanisme de garbage collection de la JVM, que nous appelons souvent GC (Garbage Collection), également appelé garbage collector.
Le principe de base du GC (Garbage Collection) : recycler les objets qui ne sont plus utilisés en mémoire. La méthode utilisée pour le recyclage dans GC est appelée un collecteur Puisque le GC a besoin de consommer des ressources et du temps, Java utilise Après avoir analysé la vie. Caractéristiques du cycle des objets, les objets sont collectés selon les méthodes de nouvelle génération et d'ancienne génération pour raccourcir autant que possible la pause provoquée par GC à l'application
● La collection d'objets de nouvelle génération est appelée GC mineure
● La collection des objets de l'ancienne génération est appelé Full GC
● Le GC forcé en appelant activement System.gc() dans le programme est Full GC
Différents types de références d'objets, GC utilisera différentes méthodes pour recycler, les objets JVM Les références sont divisées en quatre types :
● Référence forte : Par défaut, les objets utilisent des références fortes (les instances de cet objet ne sont pas référencées par d'autres objets et seront recyclées uniquement dans GC)
● Référence douce : La référence douce est la clé en Java Elle fournit une application qui est plus adapté aux scénarios de mise en cache (il ne sera GCé que lorsque la mémoire n'est pas suffisante)
● Référence faible : Elle sera définitivement recyclée par GC lors du GC
● Référence virtuelle : Parce que la référence virtuelle n'est utilisée que pour savoir si le l'objet est GC
L'objet est marqué comme une méthode poubelle
La structure de mémoire de la JVM comprend cinq zones principales?: 程序計數器
、虛擬機棧
、本地方法棧
、堆區(qū)
、方法區(qū)
. Parmi elles, les trois zones du compteur de programme, de la pile de machines virtuelles et de la pile de méthodes locales naissent et sont détruites avec le thread. Par conséquent, l'allocation de mémoire et le recyclage de ces zones sont déterministes et il n'est pas nécessaire de considérer le problème du recyclage. trop, car Lorsque la méthode se termine ou que le thread se termine, la mémoire sera naturellement recyclée. La zone de tas Java et la zone de méthode sont différentes. L'allocation et le recyclage de cette partie de la mémoire sont dynamiques, c'est sur quoi le garbage collector doit se concentrer.
1. Compteur de références
Le comptage de références est une des premières stratégies du garbage collector. Dans cette approche, chaque instance d'objet dans le tas a un décompte de références. Lorsqu'un objet est créé, l'instance d'objet est affectée à une variable et le nombre de variables est défini sur 1. Lorsqu'une référence à cet objet est affectée à une autre variable, le décompte est augmenté de 1 (a = b, puis le compteur de l'instance d'objet référencée par b + 1), mais lorsqu'une référence d'une instance d'objet dépasse le cycle de vie ou est défini sur Lorsqu'une nouvelle valeur est atteinte, le compteur de référence de l'instance d'objet est décrémenté de 1. Toute instance d'objet avec un compteur de référence de 0 peut être récupérée. Lorsqu'une instance d'objet est récupérée, le compteur de références de toute instance d'objet qu'elle référence est décrémenté de un.
Avantages?: Le collecteur de comptage de références peut être exécuté rapidement et est étroitement lié au fonctionnement du programme. C'est plus avantageux pour les environnements en temps réel où le programme ne doit pas être interrompu pendant une longue période.
Inconvénients?: Impossible de détecter les références circulaires. Si l'objet parent a une référence à l'objet enfant, l'objet enfant fait à son tour référence à l'objet parent. De cette fa?on, leur nombre de références ne peut jamais être nul.
Analyse du code ci-dessus via la méthode de comptage de références?:
2. .Algorithme, le programme traite toutes les relations de référence comme un graphique, à partir d'un n?ud GC Roots, à la recherche du n?ud de référence correspondant. Après avoir trouvé ce n?ud, continuez à rechercher le n?ud de référence de ce n?ud. Lorsque tous les n?uds de référence sont recherchés, les n?uds restants. sont considérés comme des n?uds qui n'ont pas été référencés, c'est-à-dire que les n?uds inutiles seront considérés comme des objets recyclables.
Dans le langage Java, les objets pouvant être utilisés comme racines GC sont les suivants?:
● Objets référencés dans la pile de la machine virtuelle (table de variables locales dans le cadre de la pile) ● Objets référencés par les attributs statiques de classe dans la méthode?; zone?;
● Objets référencés par des constantes dans la zone de méthode?;
● Objets référencés par JNI (méthodes natives) dans la pile de méthodes locale. On peut conclure que les instances d'objet 1, 2, 4 et 6 ont toutes une accessibilité d'objet, c'est-à-dire des objets survivants et des objets qui ne peuvent pas être recyclés par GC. Bien que les instances Caprice 3 et 5 soient directement connectées, aucune racine GC ne leur est connectée, c'est-à-dire que les objets inaccessibles par les racines GC seront recyclés par GC.
3. Algorithme de collecte des déchets
1. Algorithme de marquage L'idée de base de l'algorithme de marquage/effacement est tout comme son nom, qui est divisé en deux étapes?: "marquer" et " clear": premier marquage Supprimez tous les objets qui doivent être recyclés et recyclez uniformément tous les objets marqués une fois le marquage terminé.
étape de marquage?: Le processus de marquage est en fait le processus de l'algorithme d'analyse d'accessibilité introduit précédemment. Il parcourt tous les objets GC Roots et met une marque sur les objets accessibles depuis l'objet GCRoots. objet, enregistrez-le comme un objet accessible.
Phase de nettoyage?: Le processus de nettoyage consiste à parcourir la mémoire du tas. S'il s'avère qu'un objet n'est pas marqué comme objet accessible (en lisant les informations d'en-tête de l'objet), il sera recyclé.
L'image ci-dessus est un diagramme schématique de l'algorithme de marquage/effacement. Dans la phase de marquage, l'objet B est accessible à partir de l'objet GC Root 1 et l'objet E est accessible à partir de l'objet B. Par conséquent, à partir de la racine GC. 1 à B et E, les deux sont accessibles De même, les objets F, G, J et K sont tous des objets accessibles en phase de nettoyage, tous les objets inaccessibles seront recyclés.
Inconvénients de l'algorithme de marquage/effacement?: ● Problèmes d'efficacité
Les deux étapes de marquage et d'effacement ne sont pas très efficaces, car les deux étapes doivent parcourir les objets dans la mémoire, et plusieurs fois les objets dans la mémoire. mémoire Le nombre d'instances est très important, ce qui prend sans aucun doute du temps, et l'application doit être arrêtée pendant le GC, ce qui entra?nera une très mauvaise expérience utilisateur. ●
Problème d'espace
Une fois la marque effacée, un grand nombre de fragments de mémoire discontinus seront générés (comme le montre l'image ci-dessus). Un trop grand nombre de fragments d'espace mémoire peut entra?ner l'incapacité de trouver des objets plus gros qui en ont besoin. à allouer pendant l'exécution du programme. Suffisamment de mémoire contigu? pour déclencher une autre action de garbage collection à l'avance.
2. Algorithme de copie L'algorithme de copie divise la mémoire disponible en deux blocs de taille égale en fonction de la capacité et utilise un bloc à la fois. Lorsque ce bloc de mémoire est épuisé, copiez les objets survivants dans un autre bloc de mémoire, puis nettoyez tous les objets de ce bloc de mémoire en même temps
L'algorithme de copie recycle la mémoire de la moitié entière de la zone à chaque fois, ce qui réduit le temps de parcours des objets marqués. Lors de l'effacement des objets de zone utilisés, il n'est pas nécessaire de parcourir, toute la mémoire de la zone est directement effacée et les objets survivants. les objets sont copiés dans la zone réservée. Les régions sont également stockées dans l'ordre des adresses, ce qui résout le problème de la fragmentation de la mémoire. Lors de l'allocation de la mémoire des objets, il n'est pas nécessaire de prendre en compte des problèmes complexes tels que la fragmentation de la mémoire. .
Inconvénients de l'algorithme de copie :
L'algorithme de copie est simple et efficace, optimisant les problèmes de faible efficacité et de fragmentation de la mémoire de l'algorithme de marque et d'effacement. Il y a des inconvénients :
● Réduire la mémoire à la moitié de l'original. taille, gaspillant la moitié de l'espace mémoire, Le co?t est trop élevé?;
● Si le taux de survie de l'objet est très élevé, dans un cas extrême, en supposant que le taux de survie de l'objet est de 100?%, alors nous devons copier tous les objets survivants. , et le co?t en temps ne peut être ignoré.
3. Algorithme Mark-Collate
Algorithme Mark-Collate L'algorithme est très similaire à l'algorithme mark/clear. En fait, le processus de marquage de l'algorithme mark/assemblate est toujours le même que celui de l'algorithme mark/clear. , mais les étapes suivantes ne sont pas directement liées aux objets recyclables. Les objets recyclables sont recyclés, mais tous les objets survivants sont déplacés vers une extrémité, puis la mémoire au-delà du bord d'extrémité est directement effacée.
Vous pouvez voir que les objets recyclables sont nettoyés après recyclage et que les objets survivants sont classés en mémoire selon des règles. De cette fa?on, lorsque nous allouons de la mémoire à un nouvel objet, le jvm n'a besoin que de conserver l'adresse de départ de la mémoire. L'algorithme de marquage/organisation compense le problème de fragmentation de la mémoire de l'algorithme de marquage/effacement et élimine le co?t élevé de la réduction de moitié de la mémoire de l'algorithme de copie. On peut dire qu'il fait d'une pierre deux coups.
Inconvénients du marquage/organisation :
● Inefficacité : non seulement les objets survivants doivent être marqués, mais aussi les adresses de référence de tous les objets survivants doivent être organisées, ce qui n'est pas aussi efficace que l'algorithme de copie.
4. Algorithme de collecte générationnelle
L'idée de l'algorithme de collecte générationnelle est de diviser la mémoire en plusieurs blocs en fonction des différents cycles de survie des objets. Généralement, le tas Java est divisé en nouvelle génération et. l'ancienne génération (il existe également une génération permanente, c'est une implémentation unique de HotSpot. Les autres implémentations de machines virtuelles n'ont pas ce concept. L'effet de collecte de la génération permanente est très faible. Généralement, le garbage collection de la génération permanente est rarement effectué), afin de pouvoir utiliser l’algorithme de collecte le plus approprié en fonction des caractéristiques de chaque époque.
Caractéristiques :
La nouvelle génération : elle na?t et dispara?t rapidement, et sa durée de survie est très courte. Utilisez l'algorithme de réplication pour collecter
Ancienne génération?: survivez après plusieurs GC mineurs et ayez une longue période de survie. Utilisez l'algorithme mark/clear ou l'algorithme mark/organize pour collecter l'ancienne génération
Chaque garbage collection de la nouvelle génération constate qu'un grand nombre d'objets meurent et que seuls quelques-uns survivent. Par conséquent, un algorithme de copie est utilisé pour recycler les objets. nouvelle génération, qui ne nécessite que le co?t de copie d'un petit nombre d'objets. La collection peut être complétée
Le taux de survie des objets de l'ancienne génération est élevé et n'est pas adapté à l'utilisation de l'algorithme de copie ; La génération utilise l'algorithme de copie, elle n'aura pas d'espace supplémentaire pour la garantie d'allocation, donc l'algorithme de marquage/nettoyage ou l'algorithme de marquage/collage pour le recyclage.
Les objets de la nouvelle génération "vivent et meurent". Chaque fois que GC se produit, un grand nombre d'objets mourront et un petit nombre survivra. L'algorithme de réplication est utilisé. La nouvelle génération est divisée en zone Eden et zone Survivant (Survivant de, Survivant vers), et le rapport de taille par défaut est de 8:1:1.
Les objets de l'ancienne génération utilisent l'algorithme de marquage ou de complément de marquage car le taux de survie des objets est élevé et il n'y a pas d'espace supplémentaire pour la garantie d'allocation.
Les objets nouvellement générés entrent en premier dans la zone Eden. Lorsque la zone Eden est pleine, Survivor from est utilisé. Lorsque Survivor from est également plein, un GC mineur (nouvelle génération GC) est effectué et les objets survivants dans Eden et Survivor from sont copiés. dans Survivant, puis éliminez Eden et Survivant. à ce moment-là, le Survivant d'origine devient le nouveau Survivant de, et le Survivant d'origine devient le nouveau Survivant de. Lors de la copie, si le survivant ne peut pas accueillir tous les objets survivants, les objets seront copiés dans l'ancienne génération sur la base de la garantie d'attribution de l'ancienne génération (similaire à la garantie de prêt d'une banque si l'ancienne génération ne peut pas l'héberger, un GC complet). (ancienne génération) sera réalisée.
Les objets volumineux entrent directement dans l'ancienne génération : Il existe une configuration de paramètre dans la JVM
-XX:PretenureSizeThreshold, qui fait que les objets plus grands que cette valeur de paramètre entrent directement dans l'ancienne génération. Le but est d'éviter un grand nombre de copies de mémoire entre. les zones Eden et Survivor.
Les objets survivants à long terme entrent dans l'ancienne génération : JVM définit un compteur d'age d'objet pour chaque objet si l'objet survit encore après la naissance d'Eden et passe le premier GC mineur, et peut être hébergé par le survivant, il sera déplacé vers. le survivant et son age est fixé à 1. S'il n'a pas survécu à un GC mineur, son age sera augmenté de 1. Lorsque son age atteint un certain niveau (la valeur par défaut est de 15 ans, qui peut être définie via XX:MaxTenuringThreshold), il sera déplacé vers l'ancienne génération. . Cependant, la JVM n'exige pas toujours que l'age atteigne l'age maximum avant d'être promu à l'ancienne génération si la somme des tailles de tous les objets du même age (par exemple, l'age est x) dans l'espace Survivant est égale. supérieur à la moitié du Survivant, tous les objets ayant un age supérieur ou égal à x entreront directement dans l'ancienne génération, pas besoin d'attendre l'age maximum requis.
Recyclage générationnel?:
Nous utilisons un objet1 pour illustrer sa trajectoire de recyclage dans l'algorithme de collecte des déchets générationnel.
1. Object1 est nouvellement créé et est né dans la zone Eden de la nouvelle génération.
2. GC mineur, l'objet1 est toujours vivant et déplacé vers l'espace From survivant Il est toujours dans la nouvelle génération en ce moment.
3. GC mineur, l'objet1 est toujours en vie. à ce moment, l'objet1 sera déplacé vers la zone ToSuv via l'algorithme de copie. à ce moment, l'age de l'objet1 est de +1.
4. GC mineur, l'objet1 est toujours en vie A ce moment, les objets du même age que l'objet1 chez le survivant n'ont pas atteint la moitié des survivants, donc à ce moment, les zones fromSuv et Tosuv sont échangées. via l'algorithme de copie, et les objets survivants sont déplacés vers Tosuv.
5. GC mineur, l'objet1 est toujours vivant, à ce moment, les objets du même age que l'objet1 chez le survivant ont atteint plus de la moitié des survivants (la zone toSuv est pleine), et l'objet1 est déplacé. à la zone de l’ancienne génération.
6. Après que l'objet1 ait survécu pendant un certain temps, il s'avère que l'objet1 ne peut pas atteindre GcRoots à ce moment-là, et le rapport d'espace de l'ancienne génération a dépassé le seuil à ce moment-là, déclenchant majorGC (cela peut également être considéré comme fullGC, mais cela nécessite un garbage collector) Contact), object1 est recyclé à ce moment. fullGC déclenchera l’arrêt du monde.
Dans la nouvelle génération ci-dessus, nous avons mentionné l'age de l'objet. L'objet survit à l'état de survivant et ne sera pas immédiatement promu à l'objet d'ancienne génération pour éviter un impact excessif sur l'ancienne génération. les conditions suivantes peuvent être favorisées :
1. Après un gc mineur, l'age des objets survivant dans la zone survivant sera de +1 Lorsqu'il dépassera (par défaut) 15, il sera transféré à l'ancienne génération.
2. Objets dynamiques, si la taille combinée de tous les objets du même age dans l'espace survivant est supérieure à la moitié de l'espace survivant, les objets avec une note supérieure ou égale à cet age peuvent entrer directement dans l'ancienne génération.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Pour gérer correctement les transactions JDBC, vous devez d'abord désactiver le mode de validation automatique, puis effectuer plusieurs opérations, et enfin vous engager ou randonner en fonction des résultats; 1. Appelez Conn.SetAutoCommit (false) pour démarrer la transaction; 2. Exécuter plusieurs opérations SQL, telles que l'insertion et la mise à jour; 3. Appelez Conn.Commit () Si toutes les opérations sont réussies, et appelez Conn.Rollback () Si une exception se produit pour garantir la cohérence des données; Dans le même temps, les ressources TRY-With doivent être utilisées pour gérer les ressources, gérer correctement les exceptions et cl?turer les connexions pour éviter la fuite de connexion; De plus, il est recommandé d'utiliser des pools de connexion et de définir des points de sauvegarde pour réaliser un retour en arrière partiel, et de maintenir les transactions aussi courtes que possible pour améliorer les performances.

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

HTTP Log Middleware dans GO peut enregistrer les méthodes de demande, les chemins de requête, la propriété intellectuelle du client et le temps qui prend du temps. 1. Utilisez http.handlerfunc pour envelopper le processeur, 2. Enregistrez l'heure de début et l'heure de fin avant et après l'appel Suivant.Servehttp, 3. Obtenez le vrai client IP via R.RemoteAddr et X-Forwared-For Headers, 4. Utilisez le log.printf aux journaux de demande de sortie, 5. L'exemple de code complet a été vérifié pour s'exécuter et convient au démarrage d'un projet petit et moyen. Les suggestions d'extension incluent la capture des codes d'état, la prise en charge des journaux JSON et le suivi des ID de demande.

La collecte des ordures de Java (GC) est un mécanisme qui gère automatiquement la mémoire, ce qui réduit le risque de fuite de mémoire en récupérant des objets inaccessibles. 1. GC juge l'accessibilité de l'objet de l'objet racine (tel que les variables de pile, les threads actifs, les champs statiques, etc.), et les objets inaccessibles sont marqués comme des ordures. 2. Sur la base de l'algorithme de compensation de marque, marquez tous les objets accessibles et effacez des objets non marqués. 3. Adopter une stratégie de collecte générationnelle: la nouvelle génération (Eden, S0, S1) exécute fréquemment MinorGC; Les personnes agées fonctionnent moins, mais prend plus de temps pour effectuer MajorGC; Metaspace Stores Metadata de classe. 4. JVM fournit une variété de périphériques GC: SerialGC convient aux petites applications; Le parallelGC améliore le débit; CMS réduit

Le choix du bon type HTMLinput peut améliorer la précision des données, améliorer l'expérience utilisateur et améliorer la convivialité. 1. Sélectionnez les types d'entrée correspondants en fonction du type de données, tels que le texte, le courrier électronique, le tel, le numéro et la date, qui peuvent vérifier automatiquement la somme de la somme et l'adaptation au clavier; 2. Utilisez HTML5 pour ajouter de nouveaux types tels que l'URL, la couleur, la plage et la recherche, qui peuvent fournir une méthode d'interaction plus intuitive; 3. Utilisez l'espace réservé et les attributs requis pour améliorer l'efficacité et la précision du remplissage des formulaires, mais il convient de noter que l'espace réservé ne peut pas remplacer l'étiquette.

GradleisthebetterChoiceFormostNewProjectsDuetOtsSuperiorflexibility, Performance et ModerNtoolingSupport.1.gradle’sgroovy / kotlindslismoreConcis

Le report est utilisé pour effectuer des opérations spécifiées avant le retour de la fonction, telles que les ressources de nettoyage; Les paramètres sont évalués immédiatement lorsqu'ils sont reportés et les fonctions sont exécutées dans l'ordre de la dernière entrée (LIFO); 1. Plusieurs éleveurs sont exécutés dans l'ordre inverse des déclarations; 2. Communément utilisé pour le nettoyage sécurisé tel que la fermeture des fichiers; 3. La valeur de retour nommée peut être modifiée; 4. Il sera exécuté même si la panique se produit, adaptée à la récupération; 5. éviter l'abus de report dans les boucles pour éviter la fuite des ressources; Une utilisation correcte peut améliorer la sécurité et la lisibilité du code.

La réponse claire à cette question est la recommandation d'implémenter le modèle d'observateur à l'aide d'une interface d'observateur personnalisée. 1. Bien que Java offre observable et observateur, le premier est une classe et a été obsolète et manque de flexibilité; 2. La pratique recommandée moderne consiste à définir une interface d'observateur fonctionnel, et le sujet maintient la liste des observateurs et informe tous les observateurs lorsque l'état change; 3. Il peut être utilisé en combinaison avec les expressions de lambda pour améliorer la simplicité et la maintenabilité du code; 4. Pour les scénarios GUI ou Javabean, PropertyChangeListener peut être utilisé. Par conséquent, les nouveaux projets devraient adopter un schéma d'interface d'observateur personnalisé, qui est sécurisé, facile à tester et se spécialise dans le Java moderne
