Définition dynamic de la taille de segment de mémoire maximale pour le processus Java

J’ai un programme Java qui est lancé par un fichier de commandes avec une ligne comme celle-ci:

javaw -Xms64m -Xmx1024m com.acme.MyProgram 

Cependant, sur certains ordinateurs, le programme ne se lancera pas et affichera le message suivant:

Impossible de réserver suffisamment d’espace pour le tas d’objects. N’a pas pu 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 la quantité de mémoire disponible à l’avance sur l’ordinateur (à partir du fichier de commandes) et de déterminer s’il convient d’utiliser -Xmx1024m ou -Xmx512m dans l’invocation du fichier de commandes? Notez que ce fichier de commandes ne doit fonctionner que sous Windows.

En fait, la machine virtuelle Java fait déjà quelque chose de similaire. Si vous ne spécifiez pas -Xms ou -Xmx , ces valeurs sont déduites de la quantité de mémoire physique sur la machine. Ou du moins, dit cette page .

Vous pouvez définir -Xms à la taille minimale du tas, ce qui rend votre application utile, et laisser Java déterminer une valeur correcte pour -Xmx .

Vous pouvez consulter cette page pour obtenir des réponses: Obtenez JVM pour augmenter la demande de mémoire en fonction de la taille maximale de la VM?

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

Cela dit, je vérifierai aussi s’il y a un moyen de faire ce que vous demandez, car c’est une question intéressante.

Vous pouvez exécuter à partir de votre fichier de commandes, 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 fonctionnerait – si ce n’est pas le cas, vous pourriez aussi vérifier le temps d’exécution du programme … moins de 10 secondes serait un cadeau.

Juste quelques commentaires si–

Si vous savez qu’il n’a pas besoin de plus de 512, vous devriez effectuer un test pour vous assurer que 1024 vous aide réellement. De plus gros tas peuvent souvent prolonger les pauses de votre GC et ne pas faire grand chose d’autre.

Si vous êtes certain que vous utiliserez un certain nombre de ram (par exemple, le tas remplira facilement les 512 que vous allouez), vous devriez probablement définir le min à ce nombre. Définir à la fois le min et le max sur 512 est une bonne chose si votre programme alloue un tas de choses mais n’est pas situationnel (utilise toujours la même quantité de ram)