web-dev-qa-db-fra.com

Limiter l'espace de mémoire Java au cadre de jeu global

J'ai un très vieux système Linux et Java est installé et le cadre de jeu. Quand je lance Java, je reçois:

Java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

J'ai donc limité l'espace de mémoire Java dans application.conf:

jvm.memory=-Xmx256M -Xms256M

Avec ce réglage, je peux lancer jouer test, jouer courir etc.

Mais je ne peux pas courir:

play dependencies 
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Existe-t-il un fichier de configuration global ou une variable d’environnement dans lequel je peux limiter globalement l’espace mémoire Java au cadre de jeu?

Mise à jour: De plus, les éléments suivants ne fonctionnent pas:

play dependencies -Xmx256M -Xms256M
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Mise à jour 2 :

Mémoire:

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 1024
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 38912
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Limites:

cat /proc/meminfo 
MemTotal:      4139312 kB
MemFree:        332988 kB
Buffers:        105252 kB
Cached:        1705644 kB
SwapCached:          4 kB
Active:        2566216 kB
Inactive:       625032 kB
HighTotal:      786432 kB
HighFree:         1728 kB
LowTotal:      3352880 kB
LowFree:        331260 kB
SwapTotal:     4192956 kB
SwapFree:      4168224 kB
Dirty:             368 kB
Writeback:           0 kB
Mapped:        1672180 kB
Slab:           570864 kB
CommitLimit:   6262612 kB
Committed_AS:  4075144 kB
PageTables:      19884 kB
VmallocTotal:   303096 kB
VmallocUsed:     10400 kB
VmallocChunk:   292648 kB

BR,

René

32
reen

Après avoir googlé plus autour, j'ai trouvé ceci discussion. Le problème est que mon système Linux s'exécute dans un conteneur openvz:

La raison pour laquelle Java se plaint est que, au démarrage, la machine dispose de plus de 2 Go de RAM. Elle démarre donc en mode serveur, qui tente d'allouer toute la mémoire, qui échoue ensuite car elle se trouve à l'intérieur d'un VPS.

Je pourrais résoudre le problème de démarrage de Java en modifiant /usr/Java/jdk1.6.0_26/jre/lib/i386/jvm.cfg de:

-client IF_SERVER_CLASS -server
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR

à:

#-client IF_SERVER_CLASS -server
-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR

Maintenant, je peux exécuter n'importe quelle commande de lecture. Peut-être que cela aide d'autres personnes ayant des problèmes similaires liés à la virtualisation par conteneur.

BR René

19
reen

Play ne semble pas capter les paramètres jvm.memory pour les dépendances ni même la commande test. Une façon de le forcer à utiliser des paramètres spécifiques de machine virtuelle Java consiste à utiliser _Java_OPTIONS.

Par exemple:

export _Java_OPTIONS="-Xms800m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m"
play test

ou

play deps

et vous devriez voir

~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.3, http://www.playframework.org
~ framework ID is test
~
~ Running in test mode
~ Ctrl+C to stop
~ 
Picked up _Java_OPTIONS: -Xms800m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m
Listening for transport dt_socket at address: 8000

Notez que cela appliquerait ces paramètres à tous les programmes Java exécutés sur ce terminal sur lequel _Java_OPTIONS est défini.

23
Ayush Gupta

Normalement, vous pouvez spécifier des arguments de ligne de commande Java lorsque vous appelez play en utilisant le modèle suivant.

play run <appname> -Xmx256M -Xms256M

Cependant, en examinant le code python de la commande play run et de la commande play dependencies, ils invoquent Java de différentes manières. 

La commande play dependencies appelle Java sans passer par les commandes -X (pour une raison quelconque, elle passe par les commandes -D mais pas -X). Par conséquent, vous ne pouvez rien faire à part éditer le fichier deps.py dans framework/pym/play/orders et coder en dur les paramètres -Xmx et -Xms dans ce fichier.

Ce n’est pas une solution à long terme, et je vous conseillerais de créer un ticket sur Play pour permettre la lecture de ces paramètres à partir de la ligne de commande ou du fichier application.conf, mais pour l’instant, je considère cette approche comme votre seule option.

12
Codemwnci

Je viens de rencontrer ceci sur mon ordinateur portable sous Fedora et utilisant Play 2.0 lors du démarrage du shell interactif. J'ai constaté que le script de génération définit les valeurs de mémoire par défaut sur des valeurs assez élevées.

Pour résoudre ce problème, je devais éditer le script $play_dir/framework/build et modifier les valeurs manuellement. À la fin du script, il se lance comme suit:

Java ${DEBUG_PARAM} -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M ...

Il suffit de changer les valeurs -Xmx/-Xms (et éventuellement le permgen) en conséquence.

6
bpedman

Dans Play 2.2 et Java 7, c'est ce que j'ai utilisé.

$ target/universal/stage/bin/foo -mem 256 -J-server

Pour plus de détails sur -mem, veuillez consulter:

$ target/universal/stage/bin/foo -h
3
angelokh

Votre ordinateur ne dispose pas de suffisamment de mémoire RAM pour exécuter Java. Java nécessite au moins 64 Mo de RAM.

Notez que vous ne pouvez pas ajouter de mémoire libre à votre ordinateur en spécifiant -Xms en Java: Java ne peut pas ajouter de modules de mémoire à votre carte mère. -Xms indique simplement à Java la quantité de RAM disponible à prendre. Si cela échoue (= le système d'exploitation renvoie une erreur lorsque Java tente de l'allouer), vous obtenez l'erreur ci-dessus.

Je suppose qu'il n'y a pas d'espace d'échange. Regardez le résultat de cat /proc/meminfo. Ou bien vous avez un ensemble ulimit qui limite la quantité de mémoire que chaque processus peut allouer (essayez ulimit -a pour vérifier).

3
Aaron Digulla

Il semble que la commande play que vous exécutez soit en réalité un script Python qui appelle d'autres modules python de Play Framework, qui invoquent éventuellement la commande Java en tant que sous-processus.

En regardant le code source du code qui s'exécute pour la commande dependencies, il ne semble exister aucune logique permettant de charger une variable d'environnement ou quoi que ce soit d'autre pour spécifier la taille maximale de segment de mémoire comme argument -Xmx. En d'autres termes, le code Python de Play qui appelle la machine virtuelle Java dans ce script n'a aucun moyen de spécifier la taille de segment de mémoire maximale à partir de la valeur par défaut.

2
matt b

J'ai fait face au même problème. Essayez d'augmenter --XX: MaxHeapSize à une allocation plus élevée. Voici ma configuration dans path/to/framework/build

Java -Xms512M -Xmx1300M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -XX:MaxHeapSize=512m...
0
MasterV

La lecture ne reconnaît pas les options -XX. Utilisez plutôt -DX.

0
piyushGoyal