[JAVA] Collecte des ordures G1 en 3 minutes

Calendrier de l'Avent Java 2017 C'est l'article du 21e jour. Java 9 est sorti cette année et le GC par défaut pour la JVM HotSpot est maintenant G1, donc je le posterai pour un examen.

Type de GC

Quatre algorithmes GC sont implémentés dans HotSpot VM.

--Type de série --Type parallèle (type de débit)

Type de série

Il s'agit du GC par défaut pour les machines à processeur monocœur. Le traitement GC est exécuté dans un seul thread. Dans les garbage collection mineurs et les garbage collection complets, toutes les applications sont arrêtées.

01.png

Type parallèle (type de débit)

Il s'agit du GC par défaut pour les machines à processeur multicœur. Puisque le processus GC est exécuté dans plusieurs threads, le GC est exécuté plus rapidement que le type série. Dans Java7u4 ou version antérieure, seul le traitement de la zone jeune est multi-thread, et lors de l'utilisation du multi-thread pour le traitement de l'ancienne zone, il est nécessaire de spécifier l'option -XX: + UseParallelOldGC. Depuis Java7u4, GC multithread est la valeur par défaut pour les zones jeunes et anciennes.

02.png

CMS(Concurrent Mark Sweep) Ce GC est conçu pour éviter les pannes d'application à long terme associées à un garbage collection complet. Dans le garbage collection mineur, le thread d'application est arrêté comme dans le type série et le type parallèle. Le garbage collection complet n'arrête pas le thread d'application, mais utilise un ou plusieurs threads pour rechercher l'ancienne zone en arrière-plan et ignorer les objets inutilisés. Par conséquent, la durée totale d'arrêt du thread d'application est plus courte que celle du type de débit.

03.png

Qu'est-ce que G1GC?

Gestion du tas

Gestion de tas traditionnelle (série, parallèle, CMS)

05a.png

Gestion du tas G1

Le tas est divisé en régions et géré. 04a.png

Taille de la région

Dans le paramètre par défaut, la taille de la région est déterminée par la taille du tas.

Taille du tas Taille de la région
Moins de 4 Go 1MB
4 Go ou plus et moins de 8 Go 2MB
8 Go ou plus et moins de 16 Go 4MB
16 Go ou plus et moins de 32 Go 8MB
32 Go ou plus et moins de 64 Go 16MB
64 Go ou plus 32MB

Vous pouvez également spécifier la taille vous-même en utilisant l'indicateur -XX: G1HeapRegionSize = N. 0 est la valeur par défaut. N doit être une puissance de 2 et si une autre valeur est spécifiée, elle est arrondie à la puissance 2 la plus proche.

Dans la plupart des cas, la valeur par défaut est OK, mais un réglage est nécessaire dans les cas suivants. Par exemple, si la plage de fluctuation du tas est grande (-Xms4G -Xmx16G), la taille de la région est de 1 Mo par défaut et lorsque le tas est développé, le nombre de régions devient 16 000. Puisque le G1GC est conçu sur l'hypothèse que le nombre de régions est d'environ 2 048, l'efficacité du GC se détériorera. Dans un tel cas, ajustez la taille de sorte que le nombre de régions soit d'environ 2 048 en spécifiant l'option ci-dessus.

Algorithme G1GC

Dans G1, quatre processus principaux sont exécutés.

GC à la jeune région

Lorsque l'espace eden est plein, une GC à la zone jeune se produit. Lorsque le GC est terminé, l'espace Eden sera vide et la région sera libérée. Au moins une case de survivant est allouée et certains objets sont déplacés vers l'ancienne zone. 06a.png

Cycle simultané

Dans le cycle simultané, l'essentiel est de mettre une marque (X sur la figure) sur la région où l'ancienne zone n'est pas utilisée. Effectuer un GC sur la zone jeune avant de marquer.

Le cycle simultané est divisé en plusieurs phases.

  1. marque initiale
  2. scan de la région racine
  3. Marque simultanée
  4. Remarque
  5. Nettoyer
  6. nettoyage simultané

Parmi ceux-ci, les threads d'application s'arrêtent à 1, 4 et 5. 07a.png

GC mixte

L'espace Eden est complètement vidé et l'espace des survivants est ajusté. Dans l'ancienne zone, une partie de la région marquée dans le cycle simultané est libérée. Il réduit également la fragmentation du tas en déplaçant les données utilisées dans la région marquée vers une autre région. Au lieu de libérer toutes les régions marquées dans un CPG, répétez le GC mixte pour éviter une défaillance du mode simultané. 08a.png

Collecte complète des déchets

Il s'agit du ramasse-miettes complet habituel. Le garbage collection complet doit être évité dans G1. Si cela se produit, vous devez le régler. Il existe quatre causes principales pour le garbage collection complet:

Où utiliser

Le GC à utiliser doit être pris en compte en fonction de la valeur cible de performances et de l'utilisation actuelle du processeur.

Système Web

――Le type simultané est recommandé si vous souhaitez minimiser l'impact sur certaines demandes en raison de la récupération de place complète.

Système de traitement par lot

finalement

GC est le cœur de Java (JVM). Les problèmes de performances liés à la mémoire sont inévitables dans toute version Java de tout système. Je veux comprendre un peu ce nouveau G1GC par défaut.

* Remarquer *

Samedi 20 janvier 2018 aura lieu la "session de briefing JavaOne 2017 à OKINAWA"! ** Les invités de luxe arrivent! ** ** Veuillez venir à Okinawa pendant la basse saison. https://java-kuche.doorkeeper.jp/events/68540 https://java-kuche.doorkeeper.jp/events/68542

Recommended Posts

Collecte des ordures G1 en 3 minutes
Collecte des ordures - Partie 1-
Objet de valeur en 3 minutes
API Java Stream en 5 minutes
Collecte de copies approfondies en Java
Inspection continue en 5 minutes avec SonarQube
Java Performance Chapitre 5 Bases de la récupération de place