Xmxsize par défaut dans Java 8
Dans la documentation d'oracle j'ai trouvé:
-Xmxsize Spécifie la taille maximale (en octets) du pool d'allocation de mémoire en octets ... Défaut la valeur est choisie lors de l'exécution en fonction de la configuration du système.
Que signifie configuration du système?
4 answers
Cela varie en fonction de l'implémentation et de la version, mais cela dépend généralement de la machine virtuelle utilisée (par exemple client ou serveur, voir les paramètres -client
et -server
) et de la mémoire système.
Souvent, sa valeur par défaut est 1/4ème de votre mémoire physique ou 1 Go (selon le plus petit).
Les options de configuration Java (paramètres de ligne de commande) peuvent également être "externalisées" vers des variables d'environnement, y compris le -Xmx
, qui peut modifier la valeur par défaut (ce qui signifie spécifier une nouvelle valeur par défaut). Plus précisément le JAVA_TOOL_OPTIONS
variable d'environnement est vérifiée par tous les outils Java et utilisé s'il existe (plus de détails ici et ici).
, Vous pouvez exécuter la commande suivante pour voir les valeurs par défaut:
java -XX:+PrintFlagsFinal -version
, Il vous donne une très longue liste, -Xmx
est MaxHeapSize
, -Xms
est dans InitialHeapSize
. Filtrez votre sortie (par exemple |grep
sous linux) ou enregistrez-la dans un fichier afin que vous puissiez y effectuer une recherche.
Comme vous l'avez mentionné, la valeur par défaut -Xmxsize
(Taille maximale du tas) dépend de la configuration de votre système.
Java8 prend plus de 1 / 6ème de votre mémoire physique pour votre Xmssize
(Taille de tas minimale) et plus petit de 1/4ème de votre mémoire physique pour votre -Xmxsize
(Taille de tas maximale).
Ce qui signifie que si vous avez une mémoire physique de 8 Go de RAM, vous aurez Xmssize
comme Plus grand de 8*(1/6) et Plus petit de -Xmxsize
comme 8*(1/4).
Vous pouvez vérifier votre taille de tas par défaut avec
Dans Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Dans Linux:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Ces valeurs par défaut peuvent également être remplacées par le montant souhaité.
Étonnamment, cette question n'a pas de réponse documentée définitive. Peut-être qu'un autre point de données apporterait de la valeur à d'autres personnes à la recherche d'une réponse. Sur mes systèmes exécutant CentOS (6.8, 7.3) et Java 8 (build 1.8.0_60-b27, serveur 64 bits):
La mémoire par défaut est de 1/4 de la mémoire physique, non limitée à 1 Go.
En outre, -XX:+PrintFlagsFinal
imprime sur STDERR donc la commande pour déterminer la mémoire par défaut actuelle présentée par d'autres ci-dessus doit être modifiée comme suit:
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
Le ce qui suit est retourné sur le système avec 64 Go de RAM physique:
uintx MaxHeapSize := 16873684992 {product}
Sur ma machine virtuelle Ubuntu, avec 1048 Mo de RAM totale, java -XX:+PrintFlagsFinal -version | grep HeapSize
imprimé : uintx MaxHeapSize := 266338304
, ce qui représente environ 266 Mo et représente 1/4ème de ma RAM totale.