J'ai toujours pu allouer 1400 mégaoctets pour Java SE fonctionnant sous Windows XP 32 bits (Java 1.4, 1.5 et 1.6).
java -Xmx1400m ...
Aujourd'hui, j'ai essayé la même option sur une nouvelle machine Windows XP utilisant Java 1.5_16 et 1.6.0_07 et j'ai obtenu l'erreur:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Par essais et erreurs, il semble que 1200 mégaoctets soient le maximum que je puisse allouer à cette machine.
Des idées pourquoi une machine autoriserait 1400 et une autre seulement 1200?
Edit: La machine dispose de 4 Go de RAM avec environ 3,5 Go que Windows peut reconnaître.
Réponses:
Gardez à l'esprit que Windows dispose d'une gestion de la mémoire virtuelle et que la machine virtuelle Java n'a besoin que de la mémoire contiguë dans son espace d'adressage . Ainsi, les autres programmes exécutés sur le système ne devraient pas nécessairement avoir un impact sur la taille de votre tas. Ce qui vous gênera, ce sont les DLL qui sont chargées dans votre espace d'adressage. Malheureusement, les optimisations dans Windows qui minimisent le déplacement des DLL pendant la liaison font qu'il est plus probable que vous ayez un espace d'adressage fragmenté. Outre les éléments habituels, les éléments susceptibles de réduire votre espace d'adressage incluent les logiciels de sécurité, les logiciels CBT, les logiciels espions et d'autres formes de logiciels malveillants. Les causes probables des écarts sont les différents correctifs de sécurité, les versions d'exécution C, etc. Les pilotes de périphérique et les autres bits du noyau ont leur propre espace d'adressage (les 2 Go restants de l'espace de 4 Go de 32 bits).
Vous pouvez essayer de parcourir vos liaisons DLL dans votre processus JVM et essayer de rebaser vos DLL dans un espace d'adressage plus compact. Pas amusant, mais si vous êtes désespéré ...
Alternativement, vous pouvez simplement passer à Windows 64 bits et à une JVM 64 bits. Malgré ce que d'autres ont suggéré, même si cela consommera plus de RAM, vous aurez un espace d'adressage virtuel beaucoup plus contigu, et allouer 2 Go de manière contiguë serait trivial.
la source
Cela a à voir avec la mémoire contiguë.
Voici quelques informations que j'ai trouvées en ligne pour quelqu'un qui me le demandait auparavant, soi-disant d'un "dieu VM":
la source
Les limites de taille du tas Java pour Windows sont:
Cela ne vous aide pas à obtenir un plus gros tas Java, mais vous savez maintenant que vous ne pouvez pas aller au-delà de ces valeurs.
la source
Oracle JRockit , qui peut gérer un tas non contigu, peut avoir une taille de tas Java de 2,85 Go sous Windows 2003 / XP avec le commutateur / 3GB. Il semble que la fragmentation puisse avoir un impact considérable sur la taille d'un tas Java.
la source
La JVM a besoin de mémoire contiguë et en fonction de ce qui est en cours d'exécution, de ce qui était en cours d'exécution auparavant et de la façon dont Windows a géré la mémoire, vous pourrez peut-être obtenir jusqu'à 1,4 Go de mémoire contiguë. Je pense que Windows 64 bits permettra des tas plus grands.
la source
La JVM de Sun a besoin de mémoire contiguë. Ainsi, la quantité maximale de mémoire disponible est dictée par la fragmentation de la mémoire. En particulier, les DLL du pilote ont tendance à fragmenter la mémoire lors du chargement dans une adresse de base prédéfinie. Votre matériel et ses pilotes déterminent donc la quantité de mémoire que vous pouvez obtenir.
Deux sources pour cela avec des déclarations d'ingénieurs Sun: blog du forum
Peut-être une autre JVM? Avez-vous essayé Harmony ? Je pense qu'ils ont prévu d'autoriser la mémoire non continue.
la source
Je pense que cela a plus à voir avec la façon dont Windows est configuré comme l' indique cette réponse: Option Java -Xmx
Quelques tests supplémentaires: j'ai pu allouer 1300 Mo sur une ancienne machine Windows XP avec seulement 768 Mo de RAM physique (plus la mémoire virtuelle). Sur ma machine de 2 Go de RAM, je ne peux obtenir que 1220 Mo. Sur diverses autres machines d'entreprise (avec Windows XP plus ancien), j'ai pu obtenir 1400 Mo. La machine avec une limite de 1220 Mo est assez nouvelle (vient d'être achetée chez Dell), donc peut-être qu'elle a des Windows et des DLL plus récents (et plus gonflés) (il exécute Windows XP Pro Version 2002 SP2).
la source
J'ai reçu ce message d'erreur lors de l'exécution d'un programme java à partir d'un VPS virtuozzo (mémoire limitée). Je n'avais spécifié aucun argument de mémoire et j'ai trouvé que je devais définir explicitement une petite quantité car la valeur par défaut devait être trop élevée. Par exemple -Xmx32m (doit évidemment être réglé en fonction du programme que vous exécutez).
Il suffit de mettre ceci ici au cas où quelqu'un d'autre obtiendrait le message d'erreur ci-dessus sans spécifier une grande quantité de mémoire comme l'a fait l'interrogateur.
la source
Le JDK / JRE de sun a besoin d'une quantité contiguë de mémoire si vous allouez un bloc énorme.
Le système d'exploitation et les applications initiales ont tendance à allouer des bits et des morceaux lors du chargement, ce qui fragmente la RAM disponible. Si un bloc contigu n'est PAS disponible, le JDK SUN ne peut pas l'utiliser. JRockit de Bea (acquis par Oracle) peut allouer de la mémoire à partir de pièces.
la source
Tout le monde semble répondre à propos de la mémoire contiguë, mais a négligé de reconnaître un problème plus pressant.
Même avec une allocation de mémoire contiguë à 100%, vous ne pouvez pas avoir une taille de tas de 2 Gio sur un système d'exploitation Windows 32 bits (* par défaut). Cela est dû au fait que les processus Windows 32 bits ne peuvent pas adresser plus de 2 Gio d'espace.
Le processus Java contiendra perm gen (avant Java 8), la taille de la pile par thread, la surcharge de la JVM / bibliothèque (qui augmente sensiblement à chaque construction) en plus du tas .
De plus, les indicateurs JVM et leurs valeurs par défaut changent entre les versions. Exécutez simplement ce qui suit et vous aurez une idée:
De nombreuses options affectent la division de la mémoire dans et hors du tas. Vous laissant avec plus ou moins de ces 2 Gio pour jouer ...
Pour réutiliser des portions de cette réponse à moi (sur Tomcat, mais applique à tout processus Java):
la source
Voici comment augmenter la taille de la pagination
la source
** Il existe de nombreuses façons de modifier la taille du tas comme,
Ce qui a fonctionné pour moi était
Définissez le chemin JAVA_HOME approprié au cas où java serait mis à jour.
créer une nouvelle variable système ordinateur-> propriétés-> paramètre avancé- > créer une nouvelle variable système
nom: _JAVA_OPTION valeur: -Xmx750m
FYI: vous pouvez trouver l'option VM par défaut dans l'aide d'Intellij- > modifier l'option de machine virtuelle personnalisée , dans ce fichier, vous voyez la taille minimale et maximale du tas. **
la source
Premièrement, utiliser un fichier d'échange lorsque vous avez 4 Go de RAM est inutile. Windows ne peut pas accéder à plus de 4 Go (en fait, moins à cause des trous de mémoire), le fichier d'échange n'est donc pas utilisé.
Deuxièmement, l'espace d'adressage est divisé en 2, moitié pour le noyau, moitié pour le mode utilisateur. Si vous avez besoin de plus de RAM pour vos applications, utilisez l'option / 3GB dans boot.ini (assurez-vous que java.exe est marqué comme "grande adresse consciente" (google pour plus d'informations).
Troisièmement, je pense que vous ne pouvez pas allouer les 2 Go complets d'espace d'adressage car java gaspille de la mémoire en interne (pour les threads, le compilateur JIT, l'initialisation de la VM, etc.). Utilisez le commutateur / 3GB pour en savoir plus.
la source