Les deux premiers articles "Introduction à JVM - Runtime Data Area" et "JVM Common Garbage Collection Algorithms" mentionnaient en fait les spécifications JVM et les algorithmes de garbage collection couramment utilisés, en particulierJVM Il y a en fait plus d'une implémentation, il y a JRockit, J9 en attente, bien sûr. le plus célèbre est HotSpot JVM. Voici le schéma d'architecture global de HotSpot JVM Cet article se concentre sur le garbage collector (Garbage dans HotSpot<.>Collectionneur).
Les éboueurs
HotSpot existants, leurs relations et leur champ d'application sont comme indiqué ci-dessous :
Parmi eux,
G1 GC se situe très visiblement entre la nouvelle génération et l'ancienne génération. , on devine que ce G1 GC peut être utilisé aussi bien dans la nouvelle génération que dans l'ancienne génération. On peut en effet dire que G1. est un nouveau concept qui fait époqueGC.
Avant de présenter le garbage collector ci-dessus, nous devons d'abord expliquer le modeJVM de la machine virtuelle Client et Mode serveur, ce que Java peut faire, c'est être client. En termes simples, c'est GUI. Application de bureau, qui peut également être utilisée côté serveur. Deux modes : le mode Client démarre rapidement et a des performances médiocres après le démarrage ; le mode Serveur démarre lentement et a des performances plus élevées après le démarrage.
GC série(-XX :+UseSerialGC, algorithme de copie, nouvelle génération)
Il s'agit d'un éboueur plus ancien, je le comprends comme"Simple et grossier ", les méthodes simples et grossières peuvent souvent gérer des environnements simples, en faitSerial GCExactement ceci en mode Client. Il s'agit d'un garbage collector série. Serial signifie que même un processeur multicœur n'aura pas plusieurs threads à collecter en parallèle. Tandis qu'en série, les autres threads fonctionnant normalement doivent également cesser de fonctionner, ce qui est appelé « Arrêtez le. monde ». C’est en fait facile à comprendre. Lorsque vous nettoyez les poubelles, vous ne voulez pas que quelqu’un les jette en même temps. Bien sûr, le Serial GC est presque le même dans le mode HotSpot JVMServeur d'aujourd'hui. Abandonné. De plus, il fonctionne en utilisant le garbage collection "algorithme de copie " fonctionne en Java La nouvelle génération du tas.
ParNouveau GC(-XX :+Utilisation ParNewGC, Algorithme de copie, Nouvelle génération)
ParNew GC est en fait une version multithread de Serial GC. Comme mentionné ci-dessus, le Serial GCmême dans un environnement CPU multicœur est un thread unique pour le recyclage de la mémoire inutile. Ce côté du garbage collector peut recycler la mémoire inutile dans un environnement multithread. Ce multithread n'est qu'un multithread de garbage collection, plutôt que de s'exécuter simultanément avec les threads utilisateur. Et seulement il peut être utilisé avec le CMS garbage collector d'ancienne génération, et CMS est exactement le garbage collector qui fait époque,. ainsi, lorsque le garbage collector ancienne génération de JVM est CMS, le garbage collector nouvelle génération est généralement ParNew GC.
GC Parallèle (-XX:+UseParallelGC, algorithme de réplication, nouvelle génération)
Il est quelque peu similaire à ParaNew GC À en juger par son nom, c'est aussi un collecteur multithread parallèle. Nous avons déjà mentionné que lors du GC nous devons « Arrêter le monde » Plus le temps de pause est court, mieux c'est. , de nombreux garbage collectors (y compris les deux premiers) se concentrent sur la manière d'améliorer le temps de pause. Et Parallel GC se concentre sur le débit. Il se concentre sur la durée globale de la collecte des déchets. Si la durée globale de la collecte des déchets est plus courte, le débit est élevé et le CPU peut y consacrer plus de temps. . En termes d'exécution de la tâche, , (débit = durée d'exécution de la tâche / (durée d'exécution de la tâche <.> + Heure de la collecte des déchets)) .
Ancien GC en série(-XX:+UseSerialOldGC, tags-Algorithme de compression, ancienne génération)
Il s'agit de la version ancienne génération deSerial GC Il est également monothread et peut également. être utilisé avec Parallel GC est utilisé en conjonction avec son ancienne génération GC.
Ancien GC parallèle(-XX:+UseParallelOldGC, marqué - algorithme de compression, ancienne génération)
Afin d'éviter le dilemme de choisir Parallel GC dans la nouvelle génération et de choisir uniquement Serial Old GC dans l'ancienne génération, est apparu >L'ancienne version de Parallel GC——Parallel Old GC. Par conséquent, si vous utilisez la combinaison de Parallel GC et Parallel Old GC pour certaines constantes qui nécessitent un débit élevé, ce sera un bon choix.
☆Concurrent Mark Sweep(CMS) GC (-XX:+UseConcMarkSweepGC, marque-Algorithme clair, ancienne génération)
CMS GC occupe presque JVM La moitié du garbage collector d'ancienne génération, sa signification historique est que le thread de garbage collection peut presque fonctionner en même temps que le thread utilisateur. "Presque"C'est parce que cela ne peut toujours pas être fait complètement inutile"Arrêtez le monde", mais cela réduit au maximum le temps de pause.
L'ensemble de son processus de collecte des déchets peut être divisé en les 4 étapes suivantes :
Marquage initial
Marquage simultané
Remarquage
Nettoyage simultané
Ces4 étapes"Marque initiale" et " Remarque"nécessite une courte période de "Arrêtez le monde", le processus de marquage simultané est en fait Ce qui précède consiste à travailler avec le fil utilisateur en même temps, c'est-à-dire "Jeter les ordures et nettoyer en même temps", ce qui posera un problème, si la génération de déchets se produit après le marquage, alors les déchets devront attendre la prochaine fois pour être recyclés. Bien entendu, une fois le marquage terminé, les déchets n'entreront naturellement pas en conflit avec le thread utilisateur et le processus de nettoyage peut être traité en même temps que le thread utilisateur. L'un des problèmes les plus évidents et inévitables de ce ramasse-miettes est qu'il utilise la "marque-Effacer” algorithme, ce qui signifie qu'il compressera différemment les objets survivants, ce qui entraînera le problème de fragmentation de l'espace mémoire. S'il est nécessaire d'allouer un grand espace mémoire continu, alors Full GC ne peut être déclenché qu'une seule fois. L'article précédent "Algorithmes communs de collecte des déchets pour JVM" mentionnait que le nettoyage des déchets dans la nouvelle génération s'appelle "GC mineur" , et le nettoyage des déchets dans l'ancienne génération est appelé "Major GC" , et "Full GC" déclenche un garbage collection sur l'ensemble du tas. Il est concevable que le coût soit. assez élevé, et À ce stade, le thread utilisateur doit être suspendu, et il ne peut être ajusté et optimisé qu'en fonction de scénarios d'utilisation spécifiques en ajustant les paramètres du CMS GC.
☆Garbage-First (G1) GC (-XX:+UseG1GC)
G1 GC est différent de tous les éboueurs précédents Comme on peut le voir sur la deuxième photo du début, il couvre la nouvelle génération et l'ancienne génération, ou c'est tout simplement logiquement Keep . "Nouvelle Génération" et "Ancienne Génération"Cette instruction n'existe en fait pas dans la génération de mémoire. Il s'agit seulement d'une version expérimentale dans JDK6 dans JDK7u4. ne sera officiellement commercialisé que plus tard. J'expliquerai ce garbage collector séparément. De plus, son adresse papier est : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63. .6386&rep=rep1&type=pdf.
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!