Récupérateurs de mémoire JVM

1. Vue d’ensemble

Dans ce rapide tutoriel, nous allons montrer les bases des différentes implémentations de JVM Garbage Collection (GC) . En outre, nous découvrirons comment activer un type particulier de récupération de place dans nos applications.

** 2. Brève introduction à la collecte des ordures ménagères

**

D’après le nom, il semble que Garbage Collection traite de la recherche et de la suppression des déchets de la mémoire. Cependant, en réalité, Garbage Collection suit tous les objets disponibles dans l’espace de mémoire de la machine virtuelle Java et supprime les objets inutilisés.

En termes simples, GC fonctionne en deux étapes simples appelées Mark and Sweep:

  • Mark - C’est là que le ramasse-miettes identifie les morceaux de

la mémoire sont en cours d’utilisation et qui ne sont pas Balayage - ** cette étape supprime les objets identifiés pendant la phase de «marquage»

  • Avantages: **

  • Pas d’allocation manuelle de mémoire/traitement de désallocation car non utilisé

l’espace mémoire est automatiquement géré par GC ** Pas de frais de manutention

gestion ( GC ne peut à lui seul garantir la solution complète contre les fuites de mémoire, cependant, il en gère une bonne partie)

  • Désavantages:**

  • Puisque JVM doit garder trace de la création/suppression de référence d’objet,

cette activité nécessite plus de puissance de traitement que l’application d’origine.

Cela peut affecter les performances des requêtes nécessitant une mémoire importante ** Les programmeurs n’ont aucun contrôle sur la planification du temps CPU dédié

libérer des objets devenus inutiles ** L’utilisation de certaines implémentations du GC peut entraîner l’arrêt de l’application.

de façon imprévisible ** La gestion de la mémoire automatisée ne sera pas aussi efficace que la bonne

allocation/désallocation de mémoire manuelle

3. Mise en œuvre du GC

JVM a quatre types d’implémentation de GC :

  • Collecteur de déchets série

  • Collecteur de déchets parallèle

  • Ramasse-miettes CMS

  • G1 Garbage Collector

3.1. Ramasse-ordures en série

Il s’agit de la mise en oeuvre la plus simple pour le GC, car elle fonctionne avec un seul thread. Par conséquent, cette implémentation GC fige tous les threads d’application lorsqu’elle est exécutée . Par conséquent, ce n’est pas une bonne idée de l’utiliser dans des applications multithreads telles que les environnements de serveurs.

Cependant, il y avait an excellent talk par les ingénieurs de Twitter.com à QCon 2012 sur les performances de Collecteur de déchets série un bon moyen de mieux comprendre ce collectionneur.

Le CPG série est le ramasse-miettes de choix pour la plupart des applications qui ne nécessitent pas de temps de pause réduit et qui s’exécutent sur des machines de type client. Pour activer Serial Garbage Collector , nous pouvons utiliser l’argument suivant:

java -XX:+UseSerialGC -jar Application.java

** 3.2. Ramasse-ordures parallèle

**

C’est le GC par défaut de la JVM et parfois appelé Collecteur de débit. Contrairement à Serial Garbage Collector , cela utilise plusieurs threads pour gérer l’espace de tas . Mais cela bloque également les autres threads de l’application lors de l’exécution de GC .

Si nous utilisons ce GC , nous pouvons spécifier un maximum de threads pour la récupération de place, ainsi que le temps de pause, le débit et l’empreinte (taille de segment).

Le nombre de threads du ramasse-miettes peut être contrôlé à l’aide de l’option de ligne de commande -XX: ParallelGCThreads = <N> .

L’objectif de temps de pause maximal (écart[en millisecondes]entre deux GC ) est spécifié avec l’option de ligne de commande -XX: MaxGCPauseMillis = <N> .

La cible de débit maximale (mesurée en fonction du temps passé à effectuer la récupération de place par rapport au temps passé à l’extérieur de cette tâche) est spécifiée par l’option de ligne de commande -XX: GCTimeRatio = <N> .

L’empreinte de tas maximale (la quantité de mémoire de tas requise par un programme pendant l’exécution) est spécifiée à l’aide de l’option -Xmx <N> .

Pour activer le collecteur de déchets parallèle, nous pouvons utiliser l’argument suivant:

java -XX:+UseParallelGC -jar Application.java

3.3. Ramasse-miettes CMS

L’implémentation Concurrent Mark Sweep (CMS) utilise plusieurs threads de récupérateur de place pour la récupération de place. Il est conçu pour les applications qui préfèrent des pauses de récupération de place plus courtes et qui peuvent se permettre de partager les ressources du processeur avec le ramasse-miettes pendant l’exécution de l’application.

En termes simples, les applications utilisant ce type de GC répondent en moyenne plus lentement mais ne cessent pas de répondre pour effectuer le nettoyage de la mémoire.

Un point rapide à noter ici est que puisque ce GC est simultané, un appel de garbage collection explicite, tel que l’utilisation de System.gc () pendant que le processus simultané fonctionne, aboutit à https://blogs.oracle.com/jonthecollector./entry/what the heck s a[ Echec de mode concomitant/Interruption ].

Si plus de 98% du temps total est passé dans CMS garbage collection et que moins de 2% du segment de mémoire est récupéré, un OutOfMemoryError est renvoyé par le CMS collector . Si nécessaire, cette fonctionnalité peut être désactivée en ajoutant l’option -XX: -UseGCOverheadLimit à la ligne de commande.

Ce collecteur possède également un mode appelé mode incrémental qui est obsolète dans Java SE 8 et peut être supprimé dans une version majeure ultérieure.

Pour activer le CMS Garbage Collector , nous pouvons utiliser l’indicateur suivant:

java -XX:+UseParNewGC -jar Application.java

3.4. G1 Garbage Collector

G1 (Garbage First) Garbage Collector est conçu pour les applications exécutées sur des ordinateurs multiprocesseurs disposant d’un espace mémoire important. Il est disponible depuis JDK7 Update 4 et dans les versions ultérieures.

G1 collector remplacera le CMS collector car il est plus performant

Contrairement aux autres collecteurs, G1 collector partitionne le segment de mémoire en un ensemble de régions de segment de taille égale, chacune étant une plage contiguë de mémoire virtuelle.

Lors de la récupération de place, G1 affiche une phase de marquage globale simultanée (c’est-à-dire la phase 1 appelée Marking) afin de déterminer le niveau de vie des objets dans le tas.

Une fois la phase de marquage terminée, G1 sait quelles régions sont généralement vides. Il collecte d’abord dans ces zones, ce qui donne généralement une quantité d’espace libre importante (c’est-à-dire la phase 2 appelée balayage) .__ C’est pourquoi cette méthode de récupération de place s’appelle Garbage-First.

Pour activer G1 Garbage Collector , nous pouvons utiliser l’argument suivant:

java -XX:+UseG1GC -jar Application.java

** 3.5. Changements Java 8

**

Java 8u20 a introduit un paramètre JVM supplémentaire pour réduire l’utilisation inutile de la mémoire en créant trop d’instances de la même String. Ceci optimise la mémoire de segment en supprimant les valeurs dupliquées de String dans un tableau global unique char[] .

Ce paramètre peut être activé en ajoutant - XX: UseStringDeduplication en tant que paramètre JVM .

4. Conclusion

Dans ce rapide tutoriel, nous avons examiné les différentes implémentations de JVM Garbage Collection et leurs cas d’utilisation.

Une documentation plus détaillée est disponible à l’adresse here .