web-dev-qa-db-fra.com

Java -Xms effets de taille initiale

Quel est l'avantage de définir le paramètre -Xms, et d'avoir la mémoire initiale plus grande par exemple, puis celle calculée par défaut (64 Mo dans mon cas, selon Java GC tunning: http://Java.Sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc.ergonomics.default_size )?

En outre, est-il utile de définir à la fois la mémoire initiale et la mémoire maximale?

Merci.

28
SyBer

L'avantage est qu'il y a une baisse des performances lorsque vous utilisez suffisamment de tas pour qu'il soit redimensionné. Si vous le définissez initialement sur 64 Mo mais qu'il s'avère que votre application sous charge a besoin de 250 Mo, lorsque vous atteignez près de 64 Mo, la JVM allouera plus d'espace de stockage et se déplacera peut-être autour de certains objets et effectuera d'autres tâches de comptabilité. Cela prend bien sûr du temps.

Lorsque votre application est sous charge, vous voulez que toutes les ressources soient dédiées à son exécution, donc ce travail supplémentaire peut ralentir la réponse de l'application, ou même dans certains cas, elle peut se bloquer si elle manque de mémoire avant que le segment ne soit redimensionné.

Parfois, lorsque vous utilisez une application Java Java, vous verrez des instructions comme "définir Xms et Xmx sur la même valeur". Ceci est fait pour éviter le redimensionnement au total, pour que votre application démarre avec son tas déjà aussi grand qu'il ne le sera jamais.

32
Phil

L'article lié l'explique assez clairement:

Valeurs par défaut: -Xms 3670k -Xmx 64m [...] Les grandes applications serveur rencontrent souvent deux problèmes avec ces valeurs par défaut. L'une est un démarrage lent, car le segment de mémoire initial est petit et doit être redimensionné sur de nombreuses collections principales. Un problème plus urgent est que la taille de segment maximale par défaut est déraisonnablement petite pour la plupart des applications serveur. Les règles de base pour les applications serveur sont les suivantes:

  1. Sauf si vous rencontrez des problèmes avec les pauses, essayez d'allouer autant de mémoire que possible à la machine virtuelle. La taille par défaut (64 Mo) est souvent trop petite.
  2. La définition de -Xms et -Xmx sur la même valeur augmente la prévisibilité en supprimant la décision de dimensionnement la plus importante de la machine virtuelle. Cependant, la machine virtuelle ne peut alors pas compenser si vous faites un mauvais choix.
  3. En général, augmentez la mémoire à mesure que vous augmentez le nombre de processeurs, car l'allocation peut être parallélisée.

Vous pouvez également être intéressé par cette discussion du problème.

6
Roman

Quel est l'avantage de définir le paramètre -Xms, et d'avoir la mémoire initiale plus grande par exemple, puis celle calculée par défaut

Si le tas initial est petit et doit être redimensionné sur de nombreuses collections principales, le démarrage sera lent.

En outre, est-il utile de définir à la fois la mémoire initiale et la mémoire maximale?

Réglage -Xms et -Xmx à la même valeur vous donne une prévisibilité. Ceci est particulièrement important lors du dimensionnement de la JVM lors du réglage des performances. Mais la JVM ne pourra compenser aucune mauvaise décision.

J'ai tendance à utiliser les mêmes valeurs pour les serveurs de production (qui sont optimisés lors des tests de performances).

4
Pascal Thivent

S'il est normal que votre application nécessite plus de 64 Mo de mémoire de segment de mémoire, la définition de Xms sur une valeur plus élevée devrait améliorer quelque peu les performances de l'application car le VM ne devrait pas demander autant de mémoire supplémentaire que fois.

Dans un système de production, je considère la définition de Xms et Xmx à la même valeur sensible. Il s'agit essentiellement de dire "c'est la quantité de mémoire de tas que le VM peut obtenir et je le dédie tout de suite").