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


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.


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.


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


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.