web-dev-qa-db-fra.com

Réglage -XX: MaxRam

Selon ce link , il existe une option permettant de définir manuellement MaxRamSize pour limiter la machine virtuelle Java de façon à ne pas utiliser davantage de mémoire. Mais je n'ai vu aucune documentation de la même chose. Je n'ai jamais su cela. Y a-t-il quelque chose comme ça ou quelque chose de similaire? PS. Je sais et je ne cherche pas à définir des tailles de mémoire heap/stack/metaspace/native. J'aimerais simplement savoir s'il existe une option de limitation globale de la mémoire. 

L'essayer n'a pas aidé car il a erré:

Improperly specified VM option 'MaxRAM=1073741824B'
Could not create the Java Virtual Machine.
A fatal exception has occurred. Program will exit.

Enfait selon cette link open-jdk semble avoir ces options. Un autre link que j’ai trouvé, je crois, permet de définir la taille du tas. Ce qui encore ne cherche pas. Mais c'est pour Oracle, je suppose.

Pourquoi je recherche ce type d'option pour exécuter l'application à l'intérieur d'un conteneur (Like Docker) et empêcher l'application d'être tuée par le tueur de MOO. Ce que je crois, c’est que s’il existe un paramètre tel que l’application Java commettrait une erreur ou planterait avec un Java.lang.OutOfMemoryError plutôt que le conteneur en cours de fermeture. 

Mes suppositions et mes compréhensions peuvent être totalement erronées… Cette question peut également être totalement erronée et non pertinente. Mais bien sûr, demander est la voie à suivre :). 

5
Vipin Menon

Je pense que Java se plaint du "B". Selon l'entrée manuelle, la commande Java comprend les suffixes k/K ou m/M ou g/G pour les tailles. Il ne mentionne pas "B".

(Avez-vous remarqué que le message d'erreur indique "spécifiée de manière incorrecte" et non "inconnue"? Cela laisse à penser que la commande Java a reconnu l'option, mais que la syntaxe est incorrecte. Voir ci-dessus ...)

En regardant le code source OpenJDK pour Java 11, je peux voir un paramètre MaxRAM défini dans le fichier "gc_globals.hpp".

2
Stephen C

Pourquoi je recherche ce type d'option pour exécuter l'application à l'intérieur d'un conteneur (Like Docker) et empêcher l'application d'être tuée par le tueur de MOO.

C'est exactement l'option que vous recherchez. De plus, il a été correctement intégré à cgroups (~ docker) dans JDK-8170888 . Notez que cet indicateur n’empêche pas la machine virtuelle Java d’allouer plus de mémoire que sa valeur, mais donne plutôt un indice "Je sais Ma limite physique RAM est X. Veuillez allouer au sein de X "pour que JVM partage cette valeur entre le segment de mémoire Java et la mémoire native. Mais si par exemple votre application a une fuite de mémoire native ou une fuite de chargeur de classe, cette limite sera néanmoins atteinte. 

La machine virtuelle Java se plaint sur MaxRAM=1073741824B car elle n'attend pas B à la fin, elle devrait être déclarée en tant que -XX:MaxRAM=1073741824. Voir la description du drapeau: Real memory size (in bytes) used to set maximum heap size.

1
qwwdfsad

J'ai trouvé la référence

https://chriswhocodes.com/hotspot_options_jdk11.html?s=MaxRam

Mais comme le suggère Stephen C, il s’agit probablement de la B

REMARQUE: Il s'agit de la taille maximale RAM utilisée pour calculer le maximum de mémoire par tas et Direct par défaut. Cela ne permet pas une plus grande application.

Taille réelle de la mémoire (en octets) utilisée pour définir la taille de tas maximale

et pour un autre paramètre

Taille de tas maximale définie de manière ergonomique (en octets); [la valeur par défaut] zéro signifie que vous utilisez MaxRAM * MaxRAMPercentage/100


Dans Oracle/OpenJDK, il n'y a pas d'option évidente.

$ Java -version -XX:+PrintFlagsFinal | grep -i MaxRAM

Cependant, sous Linux, vous pouvez définir la taille maximale de la mémoire avec ulimit. Toutefois, cette machine plantera la JVM si elle est atteinte.

1
Peter Lawrey