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

421

Si j'omet l' -Xmxnoption 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?

Richard Dorman
la source
1
la configuration du système signifie: a) jvm client vs jvm serveur b) 32bit vs 64bit. Liens: 1) mise à jour de J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2) brève réponse: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3) réponse détaillée: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) client vs serveur: javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Vyshnav Ramesh Thrissur
2
son difficile à comprendre à partir des liens ci-dessus. Donc, résumez-les ici: La taille maximale du tas pour le client jvm est de 256 Mo (il y a une exception, lisez les liens ci-dessus). La taille de segment maximale pour le serveur jvm de 32 bits est de 1 Go et de 64 bits de 32 Go (encore une fois, il y a des exceptions ici. Veuillez le lire à partir des liens). Donc son 256 Mo ou 1 Go ou 32 Go
Vyshnav Ramesh Thrissur
Voir aussi stackoverflow.com/a/56036202/32453
rogerdpack

Réponses:

507

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.

java -XX: + PrintFlagsFinal -version | findstr HeapSize

Recherchez les options MaxHeapSize(pour -Xmx) et InitialHeapSizepour -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.

pierres333
la source
3
J'espérais une option intéressante comme celle-ci, mais cela n'a pas fonctionné pour moi en utilisant la machine virtuelle Java 6 d'IBM.
Matt Lavin
Génial! Puis-je jouer avec toutes ces options par défaut? Quelle est la variable ENV correspondante pour chacun?
Elist
28
Dans mon cas sous Linux, InitialHeapSize = 262803264et MaxHeapSize = 4206886912qui 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 -Xmx4goptions?
Yuriy Nakonechnyy
9
Sur un système Windows:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m
1
@matanster Sur mon Linux -versionsupprime le long texte "d'utilisation" stderr.
Franklin Yu
115

Pour Java SE 5: selon l' ergonomie de Garbage Collector [Oracle] :

taille initiale du tas:

Plus grand de 1/64 de la mémoire physique de la machine sur la machine ou un minimum raisonnable. Avant J2SE 5.0, la taille de segment de mémoire 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 de 1/4 de la mémoire physique ou 1 Go. Avant J2SE 5.0, la taille de segment de mémoire 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.

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 :

Dans la version 5.0 de la plate-forme J2SE, une classe de machine appelée machine de classe 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 du tas de 4 Mo
  • taille maximale du tas de 64 Mo
dogbane
la source
4
Mise en garde: c'est pour les machines de classe serveur, pas pour la classe client. Vous devez lire ce document conjointement avec java.sun.com/docs/hotspot/gc5.0/ergo5.html qui définit ces termes et ce qui arrive aux machines de classe client. dogbane, puis-je vous suggérer humblement de modifier votre réponse pour citer les passages pertinents?
Tom Anderson
3
C'est un défaut ridiculement bas en 2012. Très peu d'applications sérieuses pourront tenir dans 64 mégaoctets.
Mark E. Haase
1
Voir la réponse d'Ernesto du 30 octobre 2012 pour les machines clientes après la mise à jour 18 de Java 6.
Andy Thomas
Gardez également à l'esprit qu'il dit: "Les limites et les fractions données pour la taille de segment de mémoire sont correctes pour J2SE 5.0. Elles sont susceptibles d'être différentes dans les versions ultérieures à mesure que les ordinateurs deviennent plus puissants."
Lodovik
Soit dit en passant, cet algo est uniquement pour Parallel Garbage Collector.
Mike Argyriou
45

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 :

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

Sous Linux :

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

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

Mémoire physique de la machine et version Java.

Sarat Chandra
la source
5
n'est-ce pas 1/64 au lieu de 1/6?
Vyshnav Ramesh Thrissur
1
Oui, Xmssize (Minimum HeapSize / InitialHeapSize) représente plus de 1 / 64e de votre mémoire physique et Xmxsize (Maximum HeapSize / MaxHeapSize) représente moins de 1 / 4e de votre mémoire physique. (Par exemple, pour mon Mac, ayant 16 Go de RAM, je reçois uintx InitialHeapSize: = 268435456 {product} uintx MaxHeapSize: = 4294967296 {product}, i, e Xms est 268 MB & Xmx est 4,29 Go
sjethvani
1
Veuillez modifier la réponse. C'est 1 / 64ème, pas 1 / 6ème.
emeraldhieu
35

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.

ernesto
la source
8
Incorrect, la page liée ditgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni
5
Je viens de vérifier sur une machine Linux avec 5 Go de mémoire physique. Le tas max par défaut est de 1,5 Go
ernesto
1
@PaoloFulgoni non, un autre exemple pratique que j'observe en ce moment: 129 Go de mémoire physique entraînent 32 Go de taille de segment de mémoire maximale
Kirill
Voir la réponse de l'APL pour savoir pourquoi cela est vrai: stackoverflow.com/a/13310792/32453 Voir aussi stackoverflow.com/a/56036202/32453
rogerdpack
16

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

Configuration du tas JVM client mise à jour

Dans 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 et sinon un quart de la mémoire physique jusqu'à une taille de mémoire physique de 1 gigaoctet.

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

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

  • ...
  • L'ergonomie de configuration du tas JVM du serveur est maintenant la même que celle du client, sauf que la taille maximale par défaut du tas pour les JVM 32 bits est de 1 gigaoctet , correspondant à une taille de mémoire physique de 4 gigaoctets, et pour les JVM 64 bits est de 32 gigaoctets , correspondant à une taille de mémoire physique de 128 gigaoctets.

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

apl
la source
8

Finalement!

Depuis Java 8u191, vous avez maintenant les options:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

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 MaxRAMPercentageest 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' MaxRAMPercentageoption ressemble à ceci:

java -XX:MaxRAMPercentage=75.0  ....

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".

peterh
la source
7

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

Jetez un œil à la page de documentation

Taille de tas par défaut

Sauf si les tailles de tas initiale et maximale sont 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 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) .

  2. 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

Quels paramètres 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 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

Ravindra babu
la source
5

Le Xmset Xmxsont le drapeau de la machine virtuelle Java (JVM):

  • Xms: initial and minimumJVMheap 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 Mo
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> Démarrage JVM avec allocation de Xmsmémoire de taille
  • Xmx: maximumJVMheap 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:
      • -> JVM permet d'utiliser une Xmxmémoire de taille maximale
        • quand dépasser Xmx, serajava.lang.OutOfMemoryError
          • Comment réparer OutOfMemoryError?
            • dépasser la Xmxvaleur
              • par exemple: de -Xmx4gà-Xmx8g

Plus de détails

voir doc officiel: -X Options de ligne de commande

crifan
la source
N'est-ce pas pour la JVM JRockit? (par opposition à la machine
virtuelle Java
4

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' -Xmxoption. Si la valeur du -Xmsparamètre est inférieure à la valeur du -Xmxparamè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.

entrez la description de l'image ici

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:

  • Sauf si vous rencontrez des problèmes avec les pauses, essayez d'allouer autant de mémoire que 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 ne peut alors pas 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 parallélisée.

    Il y a l' article complet

theodor
la source