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

277

J'obtiens l'exception suivante à plusieurs reprises chaque fois que j'essaie d'exécuter le programme.

Une erreur s'est produite lors de l'initialisation de la machine virtuelle

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

N'a pas pu créer la machine virtuelle Java.

J'ai essayé d'augmenter ma mémoire virtuelle (taille de page) et la taille de la RAM, mais en vain.

Comment puis-je éliminer cette erreur?

Narendra
la source
2
J'obtiens également cette erreur lors de l'utilisation de jdk / jre 1.6 sur ma machine virtuelle, j'ai essayé de modifier les valeurs de configuration données dans les commentaires, mais cela n'a pas aidé, après la mise à jour vers jdk 1.7, l'erreur a disparu et des paramètres Xmx plus importants ont été appliqués. Il semble qu'il y ait de nombreux changements avec l'utilisation du tas depuis java 1.6.
Alexander.Iljushkin

Réponses:

214

Exécutez la JVM avec -XX:MaxHeapSize=512m(ou n'importe quel grand nombre selon vos besoins) (ou -Xmx512mpour faire court)

Bozho
la source
42
Ou le plus court, -mx256m ou -mx512m;)
Peter Lawrey
8
-Mx est-il identique à -Xmx et -XX: MaxHeapSize?
Erty Seidohl
19
Merci .. un nombre trop important peut également être un problème et peut donner la même erreur!
Dinesh Rajan du
17
Quelqu'un a trouvé une solution qui fonctionne réellement à 100% du temps? Cette solution résout le problème temporairement mais soudainement, il revient. J'ai 16 Go de RAM et je suis fatigué de cette merde. Tout allait mieux dans le bon vieux temps: [
Nilzor
6
Ne fonctionne pas pour moi sur Windows 8 avec Java x86 ou x64.
AndrewSmiley
128

Cela peut également être dû à la définition de quelque chose de trop grand sur un vm HotSpot 32 bits, par exemple:

-Xms1536m -Xmx1536m

où cela pourrait / pourrait fonctionner:

-Xms1336m -Xmx1336m
djangofan
la source
5
J'ai oublié de mentionner que ce problème devrait se produire lors du lancement dans un shell de commande 32 bits. Un shell de commande 64 bits peut ne pas avoir ce problème.
djangofan
Pour moi, cela a échoué avec la valeur par défaut et avec une valeur trop grande, alors assurez-vous d'essayer plusieurs valeurs. Merci d'avoir répondu!
Trax
47

voici comment y remédier:

  • Allez dans Démarrer-> Panneau de configuration-> Système-> Avancé (onglet) -> Variables d'environnement-> Système

    Variables-> Nouveau: nom de variable: _JAVA_OPTIONS valeur de -Xmx512M variable: nom de Path
    variable: valeur de variable:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Remplacez-le par votre chemin d'accès approprié.

Mohamed Adel
la source
1
Assez similaire à cette réponse , je dirais ...
That1Guy
Bon. En plus de ce qui précède, référez-vous aussi à celui-ci. stackoverflow.com/a/9350506/967638
Amarnath
46

Je suis tombé sur cela lors de l'utilisation de javac, et il ne semble pas reprendre les options de ligne de commande,

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
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.

donc la solution ici, il a donc mis _JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

Et cela compile très bien.

Cela m'arrive sur des machines avec beaucoup de RAM, mais avec des ulimits de mémoire inférieurs. Java décide d'allouer un gros tas car il détecte le bélier dans la machine, mais il n'est pas autorisé à l'allouer à cause des ulimits.

Jens Timmerman
la source
1
+1 pour signaler _JAVA_OPTIONS - dans mon cas, java est appelé quelque part au fond d'un script shell auquel je n'ai pas accès en écriture, donc cette option est préférable.
gerrit
Pareil ici. J'utilise des ordinateurs universitaires, donc je ne suis pas administrateur (ne peut pas modifier les variables d'environnement) et l'option de ligne de commande ne fonctionnait pas du tout. Merci beaucoup!
Kimbluey
38

Java 32 bits nécessite un espace libre contigu en mémoire pour s'exécuter. Si vous spécifiez une grande taille de segment de mémoire, il se peut qu'il n'y ait pas autant d'espace libre contigu en mémoire même si vous avez beaucoup plus d'espace libre disponible que nécessaire.

L'installation d'une version 64 bits de Java est utile dans ces cas, les exigences de mémoire contiguë ne s'appliquent qu'à Java 32 bits.

JohnEye
la source
1
Je pense que c'est la meilleure réponse au cas où vous continueriez à obtenir l'erreur après avoir utilisé l'option -Xmx [bignumber] m. M'a aidé à exécuter Apache jMeter correctement.
RuudvK
J'ai créé un tout nouveau projet, sans code autre que l'activité principale générée automatiquement, et il a produit cette erreur
behelit
1
J'appuie @RuudvK. L'installation de 64 bits m'a permis d'augmenter la mémoire maximale tout en supprimant l'erreur d'allocation de mémoire. Ce devrait être la réponse acceptée.
J Weezy
28

Combiné avec -Xmx512M, utilisez -d64 pour vous assurer que vous exécutez une machine virtuelle 64 bits. Sur une machine 64 bits, je pensais à coup sûr que j'exécutais une machine virtuelle 64 bits, mais non. Après l'installation de Java 64 bits, l'option -d64 fonctionne et -Xmx autorise des tailles de mémoire beaucoup plus importantes.

java -d64 -Xmx512M mypackage.Test
Axl
la source
4
Cette réponse devrait être au sommet. J'ai passé deux mois à lutter contre ce problème, juste pour réaliser que l'installation de Java 64 bits a résolu le problème (l'option -d64 n'était pas nécessaire dans mon cas)
Nilzor
_JAVA_OPTIONS: -d64 -Xmx1024M Option non reconnue: -d64 La machine virtuelle Java n'a pas pu être démarrée. La taille de segment maximale (-Xmx) peut être trop grande ou un outil antivirus ou pare-feu peut bloquer l'exécution.
Alexander
14

J'ai eu la même erreur et j'ai résolu cela en le configurant dans le run.conf.bat

Exécutez la JVM avec la configuration run.conf.bat dans Jboss5x

Si la mémoire disponible n'est pas disponible au fur et à mesure que vous transmettez l'instruction, veuillez apporter des modifications dans run.conf.bat

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"
Ankam shyamsundar
la source
7

Je sais qu'il y a déjà beaucoup de réponses ici, mais aucune ne m'a aidé. Finalement, j'ai ouvert le fichier /etc/elasticsearch/jvm.optionset changé:

-Xms2G
-Xmx2G

à

-Xms256M
-Xmx256M

Cela m'a résolu. J'espère que cela aide quelqu'un d'autre ici.

kramer65
la source
7

J'ai eu des problèmes similaires. J'avais installé la version 32 bits de Java sur une machine 64 bits.

En désinstallant cette version et en installant la version 64 bits de Java. J'ai pu résoudre le problème.

Manu Sharma
la source
6

Supposons que votre classe soit appelée Testdans package mypackage. Exécutez votre code comme ceci:

java -Xmx1024m mypackage.Test

Cela réservera 1024 Mo d'espace de stockage pour votre code. Si vous voulez 512 Mo, vous pouvez utiliser:

java -Xmx512m mypackage.Test

Utilisez peu m 1024m, 512metc.

euphoria83
la source
6

Parfois, cette erreur indique que la mémoire physique et l'échange sur le serveur sont réellement pleinement utilisés!

Je voyais récemment ce problème sur un serveur exécutant RedHat Enterprise Linux 5.7 avec 48 Go de RAM. J'ai trouvé que même en courant

java -version

a causé la même erreur, qui a établi que le problème n'était pas spécifique à mon application.

Fonctionnement

cat /proc/meminfo

ont rapporté que MemFree et SwapFree étaient tous deux bien inférieurs à 1% des valeurs MemTotal et SwapTotal, respectivement:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

L'arrêt de quelques autres applications en cours d'exécution sur la machine a quelque peu augmenté les chiffres de la mémoire libre:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

À ce stade, une nouvelle instance de Java démarre correctement et j'ai pu exécuter mon application.

(Évidemment, pour moi, ce n'était qu'une solution temporaire; j'ai encore une tâche en suspens pour faire un examen plus approfondi des processus en cours d'exécution sur cette machine pour voir s'il y a quelque chose qui peut être fait pour réduire les niveaux d'utilisation de la mémoire nominale, sans avoir à arrêter les applications.)

Jon Schneider
la source
Même chose ici, à java -versiondéfaut, même si top affichait encore de la gratuité: | (également dit qu'une erreur s'est produite lors de l'initialisation de la machine virtuelle. Impossible de réserver parfois suffisamment d'espace pour le tableau de marquage des cartes) Le correctif semblait être de fonctionner en haut, de rechercher les processus qui utilisaient le plus de RAM (colonne VIRT), de les tuer [postgres, appdynamics pour moi]: |
rogerdpack
Cela pourrait-il être dû à la fragmentation de la mémoire? Une réponse ci-dessus mentionne l'espace libre contigu.
Rick Moritz
6

Erreur :

Pour l'erreur, "une erreur s'est produite lors de l'initialisation de vm n'a pas pu réserver suffisamment d'espace pour jboss de tas d'objet"

Cause première :

  • Allocation de mémoire incorrecte / insuffisante à notre machine virtuelle Java, comme indiqué ci-dessous.

  • par exemple JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m" dans jboss-eap-6.2 \ bin \ standalone.conf ou "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" dans jboss-eap-6.2 \ bin \ standalone.conf.bat qui n'est rien d'autre que des paramètres de pool d'allocation de mémoire JVM.

Résolution:

  • Augmentez la taille du tas. Pour augmenter la taille du tas,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat ou jboss-eap-6.2 \ bin \ standalone.conf
  • changez -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" où -Xms est la taille minimale du tas et -Xmx est la taille maximale du tas.
  • Il n'est généralement pas recommandé d'avoir la même taille pour le min et le max.

  • Si vous exécutez votre application depuis eclipse,

  • Double-cliquez sur le serveur
  • sélectionnez 'open launch configuration' vous serez redirigé vers la fenêtre 'Edit launch configuration properties'.
  • Dans ce menu déroulant, l'onglet '(x) = Arguments'.
  • Dans Arguments VM, définissez votre taille de segment de mémoire comme indiqué ci-dessous
  • "-Dprogram.name = JBossTools: JBoss EAP 6.1+ Runtime Server" -server -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true
Prabhakar
la source
Une citation de la référence de ligne de commande Oracle : " Pour de meilleures performances, définissez -Xms à la même taille que la taille de segment de mémoire maximale, par exemple:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp "
user1438038
3

J'ai récemment rencontré ce problème. J'ai 3 applications java qui commencent avec une taille de tas de 1024m ou 1280m. Java regarde l'espace disponible dans swap, et s'il n'y a pas assez de mémoire disponible, le jvm se ferme.

Pour résoudre le problème, j'ai dû mettre fin à plusieurs programmes qui avaient une grande quantité de mémoire virtuelle allouée.

Je courais sur Linux x86-64 avec un jvm 64 bits.

codeDr
la source
3

J'avais la bonne quantité de paramètres de mémoire, mais pour moi, cela utilisait un intellij 64 bits avec jvm 32 bits. Une fois que je suis passé à une machine virtuelle 64 bits, l'erreur a disparu.

vsingh
la source
2

En supposant que vous disposez de suffisamment de mémoire libre et que vous configurez correctement vos arguments JVM, vous pouvez avoir un problème de fragmentation de la mémoire. Vérifiez la mémoire maximale Java sous Windows XP .

Daramasala
la source
2

Si vous exécutez une machine virtuelle Java 32 bits, changer la taille du segment de mémoire en plus petit serait probablement utile. Vous pouvez le faire en passant des arguments à java directement ou via des variables d'environnement comme ci-dessous,

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

Pour JVM 64 bits, une plus grande taille de tas comme -Xms512M -Xmx1536M devrait fonctionner.

Exécutez java -versionou java -d32, java--d64pour Java7, pour vérifier la version que vous utilisez.

h - n
la source
1

Quoi qu'il en soit, voici comment y remédier: Allez dans Démarrer-> Panneau de configuration-> Système-> Avancé (onglet) -> Variables d'environnement-> Variables système-> Nouveau: Nom de la variable: _JAVA_OPTIONS Valeur de la variable: -Xmx512M

OU

Modifiez l'appel de la fourmi comme indiqué ci-dessous.

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

Ça a marché pour moi.

Sudhakar
la source
1

Une erreur s'est produite lors de l'initialisation de la machine virtuelle Impossible de réserver suffisamment d'espace pour le segment d'objets 1572864 Ko

J'ai changé la valeur de la mémoire dans le fichier settings.grade 1536 en 512 et cela a aidé

Haris Durrani
la source
1

Allez dans Démarrer-> Panneau de configuration-> Système-> Avancé (onglet) -> Variables d'environnement-> Variables système-> Nouveau:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M
El mehdi AZROUR
la source
La définition de cette valeur limite globalement la taille de segment que vous pouvez attribuer à IntelliJ.
user3056052
0

Dans le cas où vous exécutez un programme java: - exécutez votre programme dans un terminal en utilisant la commande correcte pour linux, ce serait 'java -jar myprogram.jar' et ajoutez -Xms256m -Xmx512m, par exemple: 'java -jar myprogram.jar Xms256m -Xmx512m '

Dans le cas où vous exécutez un script .sh (linux, mac?) Ou un script .bat (windows) ouvrez le script et recherchez les options java si elles sont présentes et augmentez la mémoire.

Si tout ce qui précède ne fonctionne pas, vérifiez vos processus (ctrl + alt + supprimer sous Windows) (ps aux sur linux / mac) et tuez les processus qui utilisent beaucoup de mémoire et ne sont pas nécessaires pour votre système d'exploitation! => Essayez de relancer votre programme.

Fico
la source
0

Dans CASSANDRA_HOME / bin / cassandra.bat, vous trouverez la configuration suivante

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

Vous pouvez réduire 2G à un nombre plus petit, par exemple 1G ou même moins et cela devrait fonctionner.

De même si vous utilisez une boîte Unix, modifiez le fichier .sh de manière appropriée.

Deepak Singhvi
la source
0

J'ai eu la même erreur et elle a été résolue lorsque j'ai supprimé des fichiers temporaires en utilisant% temp% et en redémarrant eclipse.

Viswanath Nuggu
la source
0

Parfois, cela se rapporte à

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Si vous le définissez sur:

$ sysctl vm.overcommit_memory=0

Ça devrait marcher.

kay
la source
0

Remplacez -Xmx2Gpar -Xms512Mou une taille de mémoire supérieure dans le fichier cassandra.bat dans le répertoire bin cassandra.

Kiran
la source
0

Ouvrez le fichier gradle.properties dans le dossier android.

Remplacez cette ligne:

org.gradle.jvmargs=-Xmx1536M

avec:

org.gradle.jvmargs=-Xmx512m

Explication: limite maximale du document Gradle:

Si l'environnement de génération demandé ne spécifie pas de taille de segment de mémoire maximale, le démon utilise jusqu'à 512 Mo de segment de mémoire.

l'amour en direct
la source
-2

Pas besoin de faire quoi que ce soit juste chnage dans le fichier POM comme ci-dessous

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>
Harish
la source
2
Qui a parlé d'un fichier POM?
Henley Chiu