66 votes

Paramètres du tas de la JVM

Après avoir lu les questions déjà posées sur le sujet et beaucoup cherché sur Google, je ne suis toujours pas en mesure d'avoir une vision claire de la situation. -Xms opción

Ma question est la suivante : quelle est la différence entre java -Xms=512m -Xmx=512m y java -Xms=64m -Xmx=512m ?

Pour l'instant, j'ai la réponse suivante :

La seule différence réside dans le nombre de ramassages de déchets qui seront effectués pendant l'exécution de mon application et dans le nombre d'allocations de mémoire. Ai-je raison ?

Voici les raisons de cette réponse :

Fixer le -Xms option pour 512m ne fait pas en sorte que mon application utilise vraiment 512M de mémoire physique après le démarrage. Je suppose que cela est lié à la gestion de la mémoire virtuelle des systèmes d'exploitation modernes et aux allocations de pages paresseuses. (J'ai remarqué que le paramètre -Xms a 512M ou à 64M ne change pas du tout la mémoire initiale utilisée rapportée soit par top sous Linux soit par le gestionnaire de tâches sous Windows)

Quelqu'un peut-il m'aider à comprendre l'impact de ce Xms ou m'indiquer des liens qui m'aideront à la comprendre ?

Merci d'avance

Manu

38voto

Steve B. Points 23227

La JVM commencera par utiliser la mémoire au niveau du tas initial. Si le maxheap est plus élevé, elle augmentera jusqu'à la taille du maxheap lorsque les besoins en mémoire dépasseront sa mémoire actuelle.

Donc,

  • -Xms512m -Xmx512m

La JVM démarre avec 512 M, elle n'est jamais redimensionnée.

  • -Xms64m -Xmx512m

La JVM démarre avec 64M, s'agrandit (jusqu'à un plafond maximum de 512) si les besoins en mémoire dépassent 64.

34voto

Turismo Points 1148

Pour résumer les informations trouvées après le lien : La JVM alloue la quantité spécifiée par -Xms mais le système d'exploitation n'alloue généralement pas de pages réelles avant d'en avoir besoin. La JVM alloue donc la mémoire virtuelle spécifiée par Xms mais n'alloue la mémoire physique que lorsqu'elle en a besoin.

Vous pouvez le constater en utilisant Process Explorer de Sysinternals au lieu du gestionnaire de tâches sous Windows.

Il y a donc une réelle différence entre l'utilisation de -Xms64M et -Xms512M. Mais je pense que la différence la plus importante est celle que vous avez déjà signalée : le ramasseur de déchets fonctionnera plus souvent si vous avez vraiment besoin des 512 Mo mais que vous avez seulement commencé avec 64 Mo.

15voto

Seema Kiran Points 141

Outre les paramètres standard de Heap -Xms y -Xmx il est également bon de savoir -XX:PermSize y -XX:MaxPermSize qui est utilisé pour spécifier la taille de l'espace Perm Gen, car même si vous avez de l'espace dans d'autres générations du tas, vous pouvez manquer de mémoire si votre espace Perm Gen est plein. Ce lien donne également un bon aperçu de quelques paramètres importants de la JVM .

5voto

bajafresh4life Points 6392

La JVM redimensionne le tas de manière adaptative, c'est-à-dire qu'elle essaie de trouver la meilleure taille de tas pour votre application. -Xms et -Xmx spécifient simplement la plage dans laquelle la JVM peut opérer et redimensionner le tas. Si -Xms et -Xmx ont la même valeur, alors la taille du tas de la JVM restera constante à cette valeur.

Il est généralement préférable de définir simplement -Xmx et de laisser la JVM trouver la meilleure taille de tas, à moins qu'il y ait une raison spécifique pour laquelle vous devez donner à la JVM un gros tas au lancement de la JVM.

En ce qui concerne le moment où la JVM demande effectivement la mémoire au système d'exploitation, je pense que cela dépend de la plate-forme et de l'implémentation de la JVM. J'imagine qu'elle ne demande pas la mémoire avant que votre application n'en ait réellement besoin. -Xmx et -Xms ne font que réserver la mémoire.

4voto

Tommaso Taruffi Points 2264

Si vous avez écrit : -Xms512m -Xmx512m quand il démarre, java alloue à ce moment là 512m de ram pour son processus et ne peut pas l'incrémenter.

-Xms64m -Xmx512m au démarrage, java alloue seulement 64m de ram pour son processus, mais java peut augmenter son occupation mémoire jusqu'à 512m.

Je pense que la deuxième solution est meilleure parce que vous donnez à java la gestion automatique de la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X