Comment définir l'utilisation maximale de la mémoire pour JVM?

132

Je souhaite limiter la mémoire maximale utilisée par la JVM. Notez que ce n'est pas seulement le tas, je souhaite limiter la mémoire totale utilisée par ce processus.

Erotsppa
la source

Réponses:

94

utilisez les arguments -Xms<memory> -Xmx<memory>. Utilisez Mou Gaprès les nombres pour indiquer respectivement Meg et Gigs d'octets. -Xmsindique le minimum et -Xmxle maximum.

Prabhu R
la source
1
vous pouvez également consulter MaxPermSize.
urmalp
89
il pose des questions sur la mémoire JVM. Ce que vous avez dit, c'est la taille du tas. Ils sont tous les deux différents
vsingh
8
Pour réitérer ce que les autres commentaires mentionnent, Xms et Xmx ne configurent que le tas. Bien que la configuration de ces variables ait un effet indirect sur l'espace hors tas, la personne qui pose la question essaie de déterminer s'il existe un moyen de configurer l'utilisation totale de la mémoire (tas + non tas)
murungu
2
uhu. j'ai donc mis -Xmx524Met le processus prend 1,2 Go de RAM. (?)
phil294
7
Ce n'est pas la bonne réponse, les options -Xms et -Xmx ne régulent que la taille du tas jvm, pas l'allocation totale de mémoire.
Peter De Winter
31

Vous ne devriez pas avoir à vous soucier des fuites de mémoire de la pile (c'est très rare). La seule fois où vous pouvez perdre le contrôle de la pile, c'est avec une récursivité infinie (ou vraiment profonde).

Ce n'est que le tas. Désolé, je n'ai pas lu complètement votre question au début.

Vous devez exécuter la JVM avec l'argument de ligne de commande suivant.

-Xmx<ammount of memory>

Exemple:

-Xmx1024m

Cela permettra un maximum de 1 Go de mémoire pour la JVM.

jjnguy
la source
1
Ce n'est pas vrai, selon ce fil, il existe plusieurs façons de fuir en dehors du tas stackoverflow.com/questions/1475290/…
erotsppa
Vous avez raison, il existe de nombreuses façons d'avoir des problèmes de mémoire non liés à la pile. Cependant, ils ne sont pas très courants.
jjnguy le
9
Vous ne pouvez pas contrôler la taille de la mémoire hors tas, n'est-ce pas?
matt b
À peu près sûr que vous pouvez le contrôler via -XX:MaxDirectMemorySize. Non pas que j'ai beaucoup profilé pour être sûr mais quand même;)
alexandergunnarson
2
@alexandergunnarson Le MaxDirectMemorySizen'affecte que les tampons NIO. Toutes sortes d'autres mémoires natives sont utilisées par la JVM.
Christopher Schultz
16

Si vous souhaitez limiter la mémoire pour jvm (pas la taille du tas) ulimit -v

Pour avoir une idée de la différence entre jvm et la mémoire de tas, jetez un œil à cet excellent article http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html

vsingh
la source
8
Est ulimit une commande Linux? J'ai fait une recherche rapide sur Google et je n'ai vu aucune relation entre ulimitet la JVM. Y
Sam
11

La réponse ci-dessus est assez correcte, vous ne pouvez pas contrôler correctement la quantité de mémoire native allouée par un processus java. Cela dépend de ce que fait votre application.

Cela dit, selon la plate-forme, vous pourrez peut-être utiliser un mécanisme, ulimit par exemple, pour limiter la taille d'un java ou de tout autre processus.

Ne vous attendez pas à ce qu'il échoue gracieusement s'il atteint cette limite. Les échecs d'allocation de mémoire native sont beaucoup plus difficiles à gérer que les échecs d'allocation sur le tas Java. Il y a de bonnes chances que l'application se bloque, mais en fonction de l'importance pour le système de réduire la taille du processus qui pourrait encore vous convenir.

SmoothieMonster
la source
1

Le NativeHeap peut être augmenté de -XX: MaxDirectMemorySize = 256M (la valeur par défaut est 128)

Je ne l'ai jamais utilisé. Peut-être que vous le trouverez utile.

Mario Trucco
la source
1
Je doute que op ait voulu ceci: la mémoire native est utilisée lorsque vous faites un appel au code C / C ++ depuis java.
om-nom-nom
6
La mémoire native est également utilisée lors des appels nio si vous allouez les tampons avec de la mémoire directe. (... et classloaders, et informations sur les threads ....)
stu