Impossible de réserver suffisamment d'espace pour le tas d'objets

1. Vue d'ensemble

Dans ce didacticiel, nous allons découvrir la cause de l' erreur «Impossible de réserver suffisamment d'espace pour le tas d'objets» , tout en passant en revue certains scénarios possibles.

2. Symptômes

«Impossible de réserver suffisamment d'espace pour le tas d'objets» est une erreur JVM spécifique qui se produit lorsque le processus Java ne peut pas créer la machine virtuelle en raison de contraintes de mémoire rencontrées sur le système en cours d'exécution:

java -Xms4G -Xmx4G -jar HelloWorld.jar Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

Généralement, il existe deux scénarios possibles lorsque nous rencontrons l'erreur.

Premièrement, lorsque nous lançons un processus Java avec le paramètre de limite de taille maximale du tas ( -Xmx ) et que la valeur est supérieure à ce que le processus peut avoir sur le système d'exploitation .

La limite de taille du tas varie en fonction de plusieurs contraintes:

  • architecture matérielle (32/64 bits)
  • Version bit JVM (32/64 bits)
  • le système d'exploitation que nous utilisons

Deuxièmement, lorsque le processus Java n'est pas en mesure de réserver la quantité de mémoire spécifiée en raison d'autres applications qui s'exécutent sur le même système et consomment de la mémoire.

3. Taille du tas

L' espace de tas Java est le pool d'allocation de mémoire pour le programme Java d'exécution, géré par la JVM elle-même. Par défaut, le pool d'allocation est limité à la taille initiale et maximale. Pour en savoir plus sur Heap Space en Java, consultez cet article ici.

Voyons quelle est la taille maximale du tas dans différents environnements et comment nous pouvons définir les limites.

3.1. Taille maximale du tas

La limite de tas théorique maximale pour la JVM 32 bits et 64 bits est facile à déterminer en examinant l'espace mémoire disponible, 2 ^ 32 (4 Go) pour la JVM 32 bits et 2 ^ 64 (16 exaoctets) pour 64- bit JVM.

En pratique, en raison de diverses contraintes, la limite peut être beaucoup plus faible et varie selon le système d'exploitation. Par exemple, sur les systèmes Windows 32 bits, la plage de taille de segment maximale est comprise entre 1,4 Go et 1,6 Go . En revanche, sur les systèmes Linux 32 bits, la taille maximale du tas peut aller jusqu'à 3 Go.

Pour cette raison, si l'application nécessite un gros tas, nous devons utiliser la JVM 64 bits . Cependant, avec un tas volumineux, le garbage collector aura plus de travail à faire, il est donc important de trouver un bon équilibre entre la taille du tas et les performances.

3.2. Comment contrôler les limites de taille du tas?

Nous avons deux options pour contrôler les limites de taille de tas d'une machine virtuelle Java.

Tout d'abord, en utilisant les paramètres de ligne de commande Java à chaque initialisation JVM:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

Pour la valeur de la taille, nous pouvons ajouter la lettre k ou K , m ou M et g ou G pour indiquer respectivement kilo-octets, mégaoctets et gigaoctets. Si aucune lettre n'est spécifiée, l'unité par défaut (octet) est utilisée.

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Deuxièmement, en utilisant la variable d'environnement JAVA_OPTS pour configurer globalement les paramètres de ligne de commande Java ci-dessus. Pour cette raison, chaque initialisation JVM sur le système utilisera automatiquement les configurations définies dans la variable d'environnement.

JAVA_OPTS="-Xms256m -Xmx512m"

Pour plus d'informations, consultez notre guide complet des paramètres JVM.

4. Conclusion

Dans ce didacticiel, nous avons discuté de deux scénarios possibles lorsque JVM n'est pas en mesure de réserver suffisamment d'espace pour le tas d'objets . Nous avons également appris à contrôler les limites de taille du tas afin d'atténuer cette erreur.

Ensuite, apprenez-en plus sur les problèmes de mémoire potentiels au moment de l'exécution et comment les identifier.