Tailles maximale et minimale de tas

La compréhension du fonctionnement du récupérateur de place vous permet de définir les tailles de tas minimale et maximale pour gérer efficacement le tas.

Le récupérateur de place adapte la taille du tas de façon à maintenir l'occupation entre 40 et 70 % pour les raisons suivantes :
  • Une occupation du tas supérieure à 70 % entraîne des cycles de récupération de place plus fréquents, ce qui peut diminuer les performances. Vous pouvez modifier ce comportement en définissant l'option -Xminf.
  • Une occupation du tas inférieure à 40 % signifie des cycles de récupération de place peu fréquents. Mais ces cycles sont plus longs que nécessaires, entraînant des temps de pause plus longs, ce qui peut diminuer les performances. Vous pouvez modifier ce comportement en définissant l'option -Xmaxf.
Si vous ne définissez pas de taille de tas initiale ou maximale, le récupérateur de place étend et rétrécit le tas au gré des besoins. Toutefois, si vous corrigez la taille de segment de mémoire à l'aide des options -Xms et -Xmx , le récupérateur de place ne développe ni ne réduit le segment de mémoire Java™ . Pour optimiser les performances de l'application et rester dans la plage 40 à 70 %, la taille maximale du tas doit être réglée à une valeur au moins 43 % plus grande que l'occupation maximale de l'application. Par exemple, si une application a une occupation maximale de 70 Mo, il faut définir une taille de tas maximale de 100 Mo, comme le montre le calcul suivant :
70 + (70 * 43/100)

Régler les tailles de tas minimale et maximale à la même valeur n'est généralement pas une bonne idée, car cela revient à repousser la récupération de place au moment où le tas est plein. Par conséquent, la première fois que le récupérateur de place est exécuté, le processus peut durer plus longtemps. En outre, le tas est plus susceptible d'être fragmenté et de nécessiter un compactage. Démarrez votre application avec la plus petite taille de tas dont elle a besoin. Lorsque le récupérateur de place démarrera, il s'exécutera fréquemment et efficacement car le tas sera petit.

Si le récupérateur de place ne trouve pas suffisamment d'espace inutilisé, il exécute un compactage. Si le récupérateur de place trouve suffisamment de place ou que l'une des autres conditions d'extension de segment de mémoire est remplie (voir Heap allocation dans la documentation utilisateur OpenJ9), le récupérateur de place étend le segment de mémoire.

Par conséquent, une application s'exécute généralement jusqu'à ce que le tas soit plein. Ensuite, des cycles successifs de récupération de place récupèrent l'espace inutilisé. Lorsque le tas est plein d'objets actifs, le récupérateur de place le compacte. Si une quantité suffisante d'espace inutilisé existe toujours, le récupérateur de place étend le tas.

Dans la description précédente, vous pouvez constater que le récupérateur de place compacte le tas en fonction de l'augmentation des besoins de l'application de sorte que, lorsque le tas s'étend, il le fait avec un groupe d'objets compactés dans le bas du tas d'origine. Ce processus est un moyen efficace de gérer le tas, car le compactage s'exerce sur la plus petite taille de tas possible et n'a lieu qu'au moment où il est jugé nécessaire. Le compactage est exécuté avec les tailles de tas minimales, à mesure que le tas grandit. Le groupe d'objets initial d'une application tend, de fait, à être la clé ou le groupe de racines ; par conséquent, si vous les compactez dès le début, vous libérez le reste du tas pour d'autres objets à durée de vie plus courte.

Au bout du compte, lorsque le tas est à sa taille maximale, tous les objets à existence longue sont compactés dans le bas de celui-ci. Le compactage a eu lieu au cours de la phase la moins coûteuse en ressources de traitement. Le traitement et l'utilisation de mémoire nécessaires à l'expansion du tas sont presque anodins comparés à l'impact de la collecte et du compactage d'un très grand tas fragmenté.