Java Language Réglage de la taille du tas, du permGen et de la pile


Exemple

Lorsqu'une machine virtuelle Java démarre, elle doit connaître la taille du tas et la taille par défaut des piles de threads. Celles-ci peuvent être spécifiées en utilisant des options de ligne de commande sur la commande java . Pour les versions de Java antérieures à Java 8, vous pouvez également spécifier la taille de la région PermGen du tas.

Notez que PermGen a été supprimé dans Java 8 et que si vous tentez de définir la taille de PermGen, l'option sera ignorée (avec un message d'avertissement).

Si vous ne spécifiez pas explicitement les tailles de tas et de piles, la machine virtuelle Java utilisera les valeurs par défaut calculées de manière spécifique à la version et à la plate-forme. Cela peut entraîner votre application utilisant trop peu ou trop de mémoire. Ceci est généralement OK pour les piles de threads, mais cela peut être problématique pour un programme qui utilise beaucoup de mémoire.

Définition des tailles de tas, PermGen et par défaut:

Les options JVM suivantes définissent la taille de segment de mémoire:

  • -Xms<size> - définit la taille initiale du tas
  • -Xmx<size> - définit la taille maximale du tas
  • -XX:PermSize<size> - définit la taille initiale du PermGen
  • -XX:MaxPermSize<size> : définit la taille maximale de PermGen
  • -Xss<size> - définit la taille de la pile de threads par défaut

Le paramètre <size> peut être un nombre d'octets ou peut avoir un suffixe de k , m ou g . Ces derniers spécifient la taille en kilo-octets, mégaoctets et gigaoctets respectivement.

Exemples:

$ java -Xms512m -Xmx1024m JavaApp
$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp
$ java -Xss512k JavaApp

Trouver les tailles par défaut:

L'option -XX:+printFlagsFinal peut être utilisée pour imprimer les valeurs de tous les indicateurs avant de démarrer la machine virtuelle Java. Cela peut être utilisé pour imprimer les valeurs par défaut pour le tas et les paramètres de taille de pile comme suit:

  • Pour Linux, Unix, Solaris et Mac OSX

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

  • Pour les fenêtres:

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

La sortie des commandes ci-dessus ressemblera à ceci:

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
 intx ThreadStackSize                           = 1024            {pd product}

Les tailles sont données en octets.