Si j'omet l' -Xmxn
option de la ligne de commande Java, une valeur par défaut sera utilisée. Selon la documentation Java
"la valeur par défaut est choisie lors 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?
java
heap
heap-memory
Richard Dorman
la source
la source
Réponses:
Sous Windows, vous pouvez utiliser la commande suivante pour connaître les valeurs par défaut sur le système sur lequel vos applications s'exécutent.
Recherchez les options
MaxHeapSize
(pour-Xmx
) etInitialHeapSize
pour-Xms
.Sur un système Unix / Linux, vous pouvez faire
Je crois que la sortie résultante est en octets.
la source
InitialHeapSize = 262803264
etMaxHeapSize = 4206886912
qui fait environ 256 Mo et 4 Go si je ne me trompe pas. Est-ce à dire que chaque JVM démarre comme si elle avait été lancée avec des-Xms256m -Xmx4g
options?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
supprime le long texte "d'utilisation"stderr
.Pour Java SE 5: selon l' ergonomie de Garbage Collector [Oracle] :
MISE À JOUR:
Comme l'a souligné Tom Anderson dans son commentaire, ce qui précède concerne les machines de classe serveur. De l' ergonomie dans la machine virtuelle JavaTM 5.0 :
la source
Java 8 utilise plus de 1 / 64e de votre mémoire physique pour votre Xmssize ( taille de segment minimale) et moins de 1 / 4e de votre mémoire physique pour votre -Xmxsize (taille de segment maximale).
Vous pouvez vérifier la taille de tas Java par défaut en:
Sous Windows :
Sous Linux :
Mémoire physique de la machine et version Java.
la source
Ceci est modifié dans la mise à jour 18 de Java 6 .
En supposant que nous ayons plus de 1 Go de mémoire physique (assez courant de nos jours), c'est toujours 1 / 4ème de votre mémoire physique pour le serveur vm.
la source
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Ernesto a raison. Selon le lien qu'il a publié [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
la source
Pour IBM JVM, la commande est la suivante:
Pour plus d'informations sur IBM SDK 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 = en
la source
Finalement!
Depuis Java 8u191, vous avez maintenant les options:
qui peut être utilisé pour dimensionner le tas en pourcentage de la RAM physique utilisable. (qui est identique à la RAM installée moins ce que le noyau utilise).
Voir les notes de publication pour Java8 u191 pour plus d'informations. Notez que les options sont mentionnées sous un en-tête Docker mais en fait elles s'appliquent que vous soyez dans un environnement Docker ou dans un environnement traditionnel.
La valeur par défaut pour
MaxRAMPercentage
est de 25%. C'est extrêmement conservateur.Ma propre règle: si votre hôte est plus ou moins dédié à l'exécution de l'application Java donnée, vous pouvez sans problème augmenter considérablement. Si vous êtes sous Linux, exécutez uniquement des démons standard et avez installé de la RAM d'environ 1 Go et plus, alors je n'hésiterais pas à utiliser 75% pour le tas de la JVM. Encore une fois, n'oubliez pas que c'est 75% de la RAM disponible , pas la RAM installée . Il ne reste que les autres processus de gestion des utilisateurs qui peuvent s'exécuter sur l'hôte et les autres types de mémoire dont la JVM a besoin (par exemple pour la pile). Dans l'ensemble, cela correspond généralement bien aux 25% restants. De toute évidence, avec encore plus de RAM installée, le 75% est un pari plus sûr et plus sûr. (Je souhaite que les gens de JDK aient implémenté une option où vous pouvez spécifier une échelle)
La définition de l'
MaxRAMPercentage
option ressemble à ceci:Notez que ces valeurs en pourcentage sont de type «double» et que vous devez donc les spécifier avec un point décimal. Vous obtenez une erreur quelque peu étrange si vous utilisez "75" au lieu de "75.0".
la source
Jetez un œil à la page de documentation
Tailles initiale et maximale par défaut de la machine virtuelle Java cliente:
La taille de segment 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) .
Tailles par défaut initiale et maximale du serveur JVM:
Sur les machines virtuelles Java 32 bits, la taille de segment maximale par défaut peut aller jusqu'à 1 Go s'il y a 4 Go ou plus de mémoire physique . Sur les machines virtuelles Java 64 bits, la taille de segment maximale par défaut peut aller jusqu'à 32 Go s'il y a 128 Go ou plus de mémoire physique
Vous pouvez spécifier les tailles de segment initiale et maximale à l'aide des indicateurs -Xms (taille de segment initiale) et -Xmx (taille de segment maximale). Si vous savez combien de tas votre application a besoin pour bien fonctionner, vous pouvez définir -Xms et -Xmx sur la même valeur
la source
Le
Xms
etXmx
sont le drapeau de la machine virtuelle Java (JVM):Xms
:initial and minimum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:-server
mode: 25% de la mémoire physique libre,> = 8 Mo et <= 64 Mo-client mode
: 25% de la mémoire physique libre,> = 8 Mo et <= 16 MoTypical Size
:-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
mémoire de tailleXmx
:maximum
JVMheap 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
:Xmx
mémoire de taille maximaleXmx
, serajava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
valeur-Xmx4g
à-Xmx8g
Plus de détails
voir doc officiel: -X Options de ligne de commande
la source
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 tas. Lors de l'initialisation de la machine virtuelle, l'espace entier pour le tas est réservé. La taille de l'espace réservé peut être spécifiée avec l'
-Xmx
option. Si la valeur du-Xms
paramètre est inférieure à la valeur du-Xmx
paramètre, tout l'espace réservé n'est pas immédiatement engagé dans la machine virtuelle. L'espace non engagé est étiqueté «virtuel» sur cette figure. Les différentes parties du tas (génération permanente, génération permanente et jeune génération) peuvent se développer à la limite de l'espace virtuel selon les besoins.Par défaut, la machine virtuelle augmente ou réduit le segment de mémoire de chaque collection pour essayer de conserver la proportion d'espace libre pour les objets vivants dans chaque collection dans une plage spécifique. Cette plage cible est définie en pourcentage par les paramètres -
XX:MinHeapFreeRatio=<minimum>
et-XX:MaxHeapFreeRatio=<maximum>
, et la taille totale est limitée en dessous par-Xms<min>
et au-dessus par-Xmx<max>
.Valeur par défaut du paramètre
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 est destinée à compenser la plus grande taille 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 volumineuses rencontrent souvent deux problèmes avec ces valeurs par défaut. L'un 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:
En général, augmentez la mémoire à mesure que vous augmentez le nombre de processeurs, car l'allocation peut être parallélisée.
Il y a l' article complet
la source