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

Si je omet l’option -Xmxn de la ligne de commande Java, une valeur par défaut est utilisée. Selon la documentation Java, “la valeur par défaut est choisie au moment de l’exécution en fonction de la configuration du système”.

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

Sur les systèmes Windows, vous pouvez utiliser la commande suivante pour connaître les parameters 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.

Selon ergonomie de ramasse-miettes [Oracle] :

taille initiale du tas:

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

taille maximale du tas:

Plus petit que 1/4 de la mémoire physique ou 1 Go. Avant J2SE 5.0, la taille de stack 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.

METTRE À JOUR:

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

Dans la plate-forme J2SE version 5.0, une classe de machine appelée une machine de type serveur a été définie comme une 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 les mêmes que les valeurs par défaut 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 initiale de 4 Mo
  • taille maximale du tas de 64 Mo

Ceci est changé avec 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.

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

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

Dans la JVM du client …

  • La taille de stack maximale par défaut est la moitié de la mémoire physique jusqu’à une taille de mémoire physique de 192 Mo et, sinon, un quart de la mémoire physique jusqu’à une taille de mémoire physique de 1 Go.

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

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

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

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

la valeur par défaut est choisie lors de l’exécution en fonction de la configuration du système

Regardez la page de documentation

Taille de tas par défaut

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

  1. Tailles de segment initiale et maximale par défaut de la machine virtuelle client:

    La taille de stack maximale par défaut est la moitié de la mémoire physique jusqu’à une taille de mémoire physique de 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. Taille de segment initiale et maximale par défaut du serveur JVM:

    Sur les machines virtuelles Java 32 bits, la taille de segment maximale par défaut peut atteindre 1 Go si la mémoire physique est supérieure ou égale à 4 Go . Sur les machines virtuelles Java 64 bits, la taille de segment maximale par défaut peut atteindre 32 Go si la mémoire physique est supérieure ou égale à 128 Go.

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

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

Pour IBM JVM, la commande est la suivante:

 java -verbose:sizes -version 

Pour plus d’informations sur IBM SDK for 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

Java 8 prend plus de 1/6 de votre mémoire physique pour votre Xmssize (Minimum HeapSize) et moins de 1/4 de votre mémoire physique pour votre -Xmxsize (Maximum HeapSize).

Vous pouvez vérifier la taille de stack Java par défaut en:

Dans Windows :

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

Sous Linux :

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

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

Votre mémoire physique et votre version Java.