32 votes

Limiter globalement l'espace du tas de Java pour le cadre de jeu

J'ai un très vieux système linux et j'ai installé java et play framework. Lorsque je lance java, j'obtiens :

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 du tas de java dans application.conf :

jvm.memory=-Xmx256M -Xms256M

Avec ce paramètre, je peux lancer un test de jeu, une exécution de jeu, 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 permettant de limiter globalement l'espace de stockage de java pour le cadre de jeu ?

Mise à jour : Les éléments suivants ne fonctionnent pas non plus :

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 :

La 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,

Rene

23voto

Ayush Gupta Points 1043

Play ne semble pas prendre en compte les paramètres jvm.memory pour les dépendances ou même la commande de test. Une façon de le forcer à utiliser des paramètres JVM spécifiques serait d'utiliser _JAVA_OPTIONS.

Par exemple :

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

o

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 appliquera ces paramètres à tous les programmes java exécutés sur le terminal où _JAVA_OPTIONS est défini.

19voto

reen Points 1129

Après avoir cherché un peu plus loin, j'ai trouvé ce discussion. Le problème est que mon système Linux fonctionne dans un conteneur openvz :

La raison pour laquelle Java se plaint est qu'au démarrage, il voit que la machine dispose de plus de 2 Go de RAM. Il démarre donc en mode serveur, qui tente d'allouer toute la mémoire, ce qui échoue car il se trouve dans un VPS.

J'ai pu résoudre le problème de démarrage de java en changeant /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 lancer n'importe quelle commande de jeu. Peut-être que cela aidera d'autres personnes ayant des problèmes similaires liés à la virtualisation basée sur des conteneurs.

BR, Rene

12voto

Codemwnci Points 28817

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 regardant le code python de la fonction play run et la commande play dependencies mais ils invoquent Java de différentes manières.

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

Ce n'est pas une solution à long terme, et je vous suggère de créer un ticket sur Play pour permettre à ces paramètres d'être lus depuis la ligne de commande, ou depuis le fichier application.conf, mais pour l'instant, je considère cette approche comme votre seule option.

6voto

bpedman Points 138

Je viens de rencontrer ce problème sur mon ordinateur portable fonctionnant sous Fedora et utilisant Play 2.0 lors du simple démarrage du shell interactif. J'ai découvert que le script de construction script fixe les valeurs de mémoire par défaut à des valeurs assez élevées.

Pour résoudre ce problème, j'ai dû modifier le fichier $play_dir/framework/build script et changer les valeurs manuellement, à la fin du script il fait ce qui suit pour lancer :

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

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

3voto

Aaron Digulla Points 143830

Votre ordinateur n'a pas assez de RAM pour exécuter Java. Java a besoin d'au moins 64 Mo de RAM.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X