3 votes

Définition dynamique de la taille maximale du tas pour un processus Java

J'ai un programme Java qui est lancé par un fichier batch avec une ligne comme celle-ci :

javaw -Xms64m -Xmx1024m com.acme.MyProgram

Cependant, sur certains ordinateurs, le programme ne se lance pas et affiche le message suivant :

Impossible de réserver suffisamment d'espace pour le tas d'objets. Impossible de créer la machine virtuelle Java.

Le problème semble être que la taille maximale du pool d'allocation de mémoire est supérieure à ce que l'ordinateur peut gérer. La réduction de la taille maximale du pool d'allocation de mémoire de 1024 m à 512 m semble résoudre le problème.

Existe-t-il un moyen de déterminer à l'avance la quantité de mémoire disponible sur l'ordinateur (à partir du fichier batch) et de déterminer s'il convient d'utiliser -Xmx1024m o -Xmx512m dans l'invocation du fichier batch ? Notez que ce fichier batch ne doit fonctionner que sous Windows.

6voto

Thomas Pornin Points 36984

En fait, la VM Java fait déjà quelque chose de similaire. Si vous ne spécifiez pas -Xms o -Xmx Ces valeurs sont alors déduites de la quantité de mémoire physique de la machine. C'est du moins ce que dit cette page .

Vous pouvez définir -Xms à la taille minimale du tas qui permet à votre application d'être utile, et laissez Java déterminer une valeur appropriée pour -Xmx .

1voto

Peter Smith Points 513

0voto

Chris B. Points 1372

Si votre programme fonctionne correctement avec un tas maximal de 512 m, j'utiliserais cette valeur.

Cela dit, je vais également vérifier s'il existe un moyen de faire ce que vous demandez, car il s'agit d'une question intéressante.

0voto

Bill K Points 32115

Vous pourriez l'exécuter à partir de votre fichier batch, vérifier le niveau d'erreur à la sortie et redémarrer à une mémoire inférieure en cas d'échec. Je ne suis pas sûr que le niveau d'erreur fonctionne - si ce n'est pas le cas, vous pourriez également vérifier le temps d'exécution du programme... toute chose inférieure à 10 secondes serait un indice.

Juste quelques commentaires cependant

Si vous savez qu'il n'a pas BESOIN de plus de 512, vous devriez effectuer un test pour vous assurer que 1024 aide réellement. Des tas plus importants peuvent souvent allonger la durée des pauses GC et n'ont pas d'autre effet.

Si vous êtes certain d'utiliser une certaine quantité de mémoire vive (par exemple, le tas remplira facilement les 512 que vous allouez), vous devriez probablement fixer la valeur minimale à ce nombre. Fixer à la fois le min et le max à 512 est une bonne chose si votre programme alloue beaucoup de choses mais n'est pas situationnel (il utilise toujours à peu près la même quantité de mémoire vive).

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