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.
- 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.
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é.