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.
Quatre algorithmes GC sont implémentés dans HotSpot VM.
--Type de série --Type parallèle (type de débit)
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.
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.
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.
Le tas est divisé en régions et géré.
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.
Dans G1, quatre processus principaux sont exécutés.
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.
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.
Parmi ceux-ci, les threads d'application s'arrêtent à 1, 4 et 5.
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é.
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:
Le GC à utiliser doit être pris en compte en fonction de la valeur cible de performances et de l'utilisation actuelle du processeur.
――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.
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.
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