web-dev-qa-db-fra.com

Comment la taille de segment par défaut Java est-elle déterminée?

Si j'omets l'option -Xmxn de la ligne de commande Java, une valeur par défaut sera utilisée. Selon documentation Java

"la valeur par défaut est choisie au moment de l'exécution en fonction de la configuration du système"

Quels paramètres de configuration du système influencent la valeur par défaut?

378
Richard Dorman

Sous Windows, vous pouvez utiliser la commande suivante pour connaître les valeurs par défaut du système sur lequel vos applications s'exécutent.

Java -XX: + PrintFlagsFinal -version | findstr HeapSize

Recherchez les options MaxHeapSize (pour -Xmx) et InitialHeapSize pour -Xms.

Sur un système Unix/Linux, vous pouvez faire

Java -XX: + PrintFlagsFinal -version | grep HeapSize

Je crois que la sortie résultante est en octets.

468
stones333

Selon Ergonomie du ramasse-miettes [Oracle] :

taille initiale du segment de mémoire:

Plus grand de 1/64ème de la mémoire physique de la machine sur la machine ou d'un minimum raisonnable. Avant J2SE 5.0, la taille de segment initiale par défaut était un minimum raisonnable, qui varie en fonction de la plate-forme. Vous pouvez remplacer cette valeur par défaut à l'aide de l'option de ligne de commande -Xms.

taille maximale du segment de mémoire:

Plus petit de 1/4ème de la mémoire physique ou 1 Go. Avant J2SE 5.0, la taille de segment maximale par défaut était de 64 Mo. Vous pouvez remplacer cette valeur par défaut à l'aide de l'option de ligne de commande -Xmx.

UPDATE:

Comme l'a souligné Tom Anderson dans son commentaire, ce qui précède concerne les machines de classe serveur. De Ergonomie dans la machine virtuelle 5.0 JavaTM :

Dans la version 5.0 de la plate-forme J2SE, une classe de machine, appelée machine de classe serveur, a été définie en tant que machine avec

  • 2 processeurs physiques ou plus
  • 2 Go ou plus de mémoire physique

à l'exception des plates-formes 32 bits exécutant une version du système d'exploitation Windows. Sur toutes les autres plates-formes, les valeurs par défaut sont identiques à celles de la version 1.4.2.

Dans la version 1.4.2 de la plate-forme J2SE, les sélections suivantes ont été effectuées par défaut.

  • taille de tas initiale de 4 Mo
  • taille de tas maximale de 64 Mo
107
dogbane

Ceci est changé dans Java 6 update 18 .

En supposant que nous ayons plus de 1 Go de mémoire physique (ce qui est assez courant de nos jours), cela représente toujours 1/4 de votre mémoire physique.

30
ernesto

Java 8 utilise plus d'un sixième de votre mémoire physique pour votre taille minimum (Xmssize) et moins d'un quart de votre mémoire physique pour votre taille -Xmxsize (taille maximale). .

Vous pouvez vérifier le taille de segment Java par défaut en:

Dans Windows:

Java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Dans Linux:

Java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Quels paramètres de configuration du système influencent la valeur par défaut?

Votre version mémoire physique & Java.

20
Sarat Chandra

Ernesto a raison. Selon le lien qu'il a posté [1]:

Mise à jour de la configuration de segment de mémoire JVM client

Dans la machine virtuelle client ...

  • La taille de segment maximale par défaut est égale à la moitié de la mémoire physique, avec une taille de mémoire physique de 192 Mo ou, dans le cas contraire, un quart de la mémoire physique, avec une taille de mémoire physique de 1 Go.

    Par exemple, si votre ordinateur dispose de 128 Mo de mémoire physique, la taille de segment de mémoire maximale est de 64 Mo. Si la mémoire physique est supérieure ou égale à 1 Go, la taille de segment de mémoire maximale est de 256 Mo.

  • La taille de segment de mémoire maximale n'est pas réellement utilisée par la machine virtuelle Java, à moins que votre programme ne crée suffisamment d'objets pour l'exiger. Une quantité beaucoup plus petite, appelée taille initiale du segment de mémoire, est allouée lors de l'initialisation de la machine virtuelle Java. ...

  • ...
  • La configuration du segment de mémoire JVM du serveur est maintenant identique à celle du client, sauf que la taille de segment maximale par défaut pour les machines JVM 32 bits est de 1 gigaoctet , ce qui correspond à La taille de la mémoire physique est de 4 gigaoctets et pour les machines virtuelles Java 64 bits est de 32 gigaoctets , ce qui correspond à une taille de mémoire physique de 128 gigaoctets.

[1] http://www.Oracle.com/technetwork/Java/javase/6u18-142093.html

15
apl

la valeur par défaut est choisie au moment de l'exécution en fonction de la configuration du système

Consultez la documentation page

Taille de segment par défaut

À moins que les tailles de tas initiale et maximale ne soient spécifiées sur la ligne de commande, elles sont calculées en fonction de la quantité de mémoire disponible sur la machine.

  1. Tailles de tas initiales et maximales par défaut de la machine virtuelle Java client:

    La taille de segment maximale par défaut est la moitié de la mémoire physique, jusqu'à 192 mégaoctets (Mo) et sinon , un quart de la mémoire physique. jusqu'à une taille de mémoire physique de 1 gigaoctet (Go) .

  2. Tailles de tas initiales et maximales par défaut de la machine virtuelle Java du serveur:

    Sur les machines virtuelles Java 32 bits, , la taille de tas maximale par défaut peut aller jusqu'à 1 Go s'il existe une mémoire physique de 4 Go ou plus . Sur les machines virtuelles Java 64 bits, la taille maximale du segment de mémoire par défaut peut aller jusqu'à 32 Go si la mémoire physique est de 128 Go ou plus

Quels paramètres de configuration du système influencent la valeur par défaut?

Vous pouvez spécifier les tailles de tas initiale et maximale à l’aide des indicateurs - Xms (taille de tas initiale) et - Xmx (taille de segment maximale). Si vous savez combien de tas votre application doit bien fonctionner, vous pouvez définir - Xms et - Xmx à la même valeur

7
Ravindra babu

Pour la machine virtuelle IBM, la commande est la suivante:

Java -verbose:sizes -version

Pour plus d'informations sur le SDK IBM pour Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.Java.lnx.80 .doc/diag/appendixes/defaults.html? lang = fr

7
n0mer

Un certain nombre de paramètres affectent la taille de la génération. Le diagramme suivant illustre la différence entre l'espace engagé et l'espace virtuel dans le segment de mémoire. Lors de l'initialisation de la machine virtuelle, tout l'espace du tas est réservé. La taille de l'espace réservé peut être spécifiée avec l'option -Xmx. Si la valeur du paramètre -Xms est inférieure à la valeur du paramètre -Xmx, tout l'espace réservé n'est pas immédiatement attribué à la machine virtuelle. L'espace non engagé est appelé "virtuel" sur cette figure. Les différentes parties du tas (génération permanente, génération permanente et jeune génération) peuvent atteindre la limite de l'espace virtuel en fonction des besoins.

enter image description here

Par défaut, la machine virtuelle augmente ou réduit le segment de mémoire à chaque collection pour essayer de conserver la proportion d'espace libre disponible pour les objets vivants de chaque collection dans une plage spécifique. Cette plage cible est définie sous forme de pourcentage par les paramètres -XX:MinHeapFreeRatio=<minimum> et -XX:MaxHeapFreeRatio=<maximum>, et la taille totale est délimitée ci-dessous par -Xms<min> et au-dessus par -Xmx<max>.

Paramètre Valeur par défaut

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

Les valeurs par défaut des paramètres de taille de segment de mémoire sur les systèmes 64 bits ont été augmentées d'environ 30%. Cette augmentation vise à compenser la taille plus grande des objets sur un système 64 bits.

Avec ces paramètres, si le pourcentage d'espace libre dans une génération tombe en dessous de 40%, la génération sera étendue pour maintenir 40% d'espace libre, jusqu'à la taille maximale autorisée de la génération. De même, si l’espace libre dépasse 70%, la génération sera contractée de sorte que seulement 70% de l’espace soit libre, sous réserve de la taille minimale de la génération.

Les applications serveur de grande taille rencontrent souvent deux problèmes avec ces valeurs par défaut. L'une est le démarrage lent, car le segment de base initial est petit et doit être redimensionné sur de nombreuses collections majeures. Un problème plus urgent est que la taille de segment maximale par défaut est excessivement petite pour la plupart des applications serveur. Les règles de base pour les applications serveur sont les suivantes:

  • Sauf si vous rencontrez des problèmes de pause, essayez d’accorder le plus de mémoire possible à la machine virtuelle. La taille par défaut (64 Mo) est souvent trop petite.
  • 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 est alors incapable de compenser si vous faites un mauvais choix.
  • En général, augmentez la mémoire à mesure que vous augmentez le nombre de processeurs, car l’allocation peut être mise en parallèle.

    Il y a le article complet

4
theodor

Les variables Xms et Xmx sont un drapeau de la machine virtuelle (JVM) Java:

  • Xms: initial and minimum JVM heap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • Mode -server: 25% de mémoire physique disponible,> = 8 Mo et <= 64 Mo
      • -client mode: 25% de mémoire physique libre,> = 8 Mo et <= 16 Mo
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/Effect:
      • -> La machine virtuelle Java démarre avec allocate Xms size memory
  • Xmx: maximum JVM heap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75% de la mémoire physique totale jusqu'à 1GB
        • Linux/Solaris: 50% de la mémoire physique disponible jusqu'à 1GB
      • >= R27.3
        • Windows X64: 75% de la mémoire physique totale jusqu'à 2GB
        • Linux/Solaris X64: 50% de la mémoire physique disponible jusqu'à 2GB
        • Windows x86: 75% de la mémoire physique totale jusqu'à 1GB
        • Linux/Solaris X86: 50% de la mémoire physique disponible jusqu'à 1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/Effect:
      • -> La machine virtuelle Java autorise l'utilisation maximale de Xmx taille mémoire
        • quand dépasser Xmx, sera Java.lang.OutOfMemoryError
          • Comment réparer OutOfMemoryError?
            • dépasser Xmx valeur
              • par exemple: de -Xmx4g à -Xmx8g

Plus de détails

voir la documentation officielle: - X Options en ligne de commande

3
crifan