105 votes

Mémoire maximum de Java sur Windows XP

J'ai toujours été en mesure d'allouer 1400 mo pour Java SE exécutant sur 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 à l'aide de Java 1.5_16 et 1.6.0_07 et 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 essai et erreur, il semble 1200 mo est le plus que je peux allouer sur cette machine.

Des idées pourquoi une machine qui permettrait à 1400 et un autre seulement 1200?

Edit: La machine dispose de 4 go de RAM avec environ 3,5 GO de mémoire que Windows puisse les reconnaître.

126voto

Christopher Smith Points 2077

Gardez à l'esprit que Windows a de gestion de mémoire virtuelle et de la JVM que les besoins de la mémoire qui est contiguë dans son espace d'adressage. Ainsi, d'autres programmes en cours d'exécution sur le système ne devrait pas nécessairement des répercussions sur votre taille de segment de mémoire. Ce qui va dans votre sens sont des DLL qui sont chargées dans votre espace d'adressage. Malheureusement, des optimisations de Windows, permettant de minimiser la réinstallation de DLL au cours reliant la rendre plus probable que vous aurez un fragmentée de l'espace d'adresse. Les choses qui sont susceptibles de couper dans votre espace d'adressage à part les trucs habituels incluent la sécurité des logiciels, CBT logiciel, les logiciels espions et autres formes de logiciels malveillants. Les causes probables de les variances sont différentes de correctifs de sécurité, C versions du moteur d'exécution, etc. Pilotes de périphérique et d'autre du noyau bits ont leur propre espace d'adressage (l'autre de 2 go à 4 go espace de 32 bits).

Vous pourriez essayer d'aller à travers votre DLL liaisons dans votre processus de JVM et essayer de rebase votre DLL dans le plus compact de l'espace d'adresse. Pas de plaisir, mais si vous êtes désespérés...

Alternativement, vous pouvez simplement passer à la version 64 bits de Windows et une JVM 64 bits. En dépit de ce que les autres ont suggéré, bien mâcher plus de mémoire vive, vous aurez beaucoup plus d'espace d'adressage virtuel contiguë, et de l'allocation de 2 GO de manière contiguë serait trivial.

51voto

Uri Points 50687

Cela a à voir avec la mémoire contiguë.

Voici quelques infos que j'ai trouvé en ligne pour quelqu'un demandant qu'avant, soi-disant de la "VM dieu":

La raison nous avons besoin d'une mémoire contiguë région de le tas, c'est que nous avons un tas de côté les structures de données indexé par (mise à l'échelle) les compensations de l' début de la tas. Par exemple, nous la piste de l'objet de référence mises à jour avec une "carte de marque array" qui a un octet pour chaque 512 octets de mémoire. Lorsque nous stocker une référence dans le tas, nous avons pour marquer l'octet correspondant à la carte de marque de tableau. Nous décalage à droite de l' adresse de destination de la boutique et l'utiliser à l'index de la carte de marque de tableau. Le plaisir d'adressage de l'arithmétique jeux vous ne peut pas le faire en Java que vous obtenez à l' (ont :-) jouer en C++.

Habituellement, nous n'avons pas de peine à l'obtenir modeste régions contiguës (jusqu'à environ 1,5 GO sur Windohs, jusqu'à environ 3,8 GO sur Solaris. YMMV.). Sur Windohs, l' le problème est surtout qu'il y a quelques les bibliothèques pouvant être chargés avant l' JVM démarrage qui rompent l' adresse de l'espace. Utilisez le commutateur /3GB ne rebase ces bibliothèques, de sorte qu'ils sont toujours un problème pour nous.

Nous savons comment faire un tas, mais il n'y aurait que des frais généraux à l'aide de . Nous avons plus de demandes pour les plus rapides la gestion du stockage que nous faisons pour plus des tas de la JVM 32 bits. Si vous voulez vraiment gros tas, passer à la La JVM 64 bits. Nous avons encore besoin de contiguë de mémoire, mais il est beaucoup plus facile à obtenir dans une version 64 bits de l'adresse de l'espace.

20voto

MicSim Points 12980

Selon cette IBM document sur le tas Java taille (ainsi que quelques conseils sur la configuration de la bonne taille de segment de mémoire) les limites pour Windows sont:

  • maximale possible de la taille de segment de mémoire sur 32 bits de Java: 1.8 GO
  • recommandé tas de limite de taille de 32 bits de Java: 1,5 GO (ou 1,8 GO avec option /3GB)

Ce n'est pas vous aider à obtenir un plus grand segment Java, mais maintenant vous savez que vous ne pouvez pas aller au-delà de ces valeurs.

10voto

Kire Haglin Points 2402

Oracle JRockit, qui peut gérer un tas non contigus, peuvent avoir une taille de tas de Java de 2,85 Go sous Windows 2003/XP avec le commutateur/3 GB. Il semble que fragmentation peut avoir un impact sur comment grand un tas de Java peut être.

6voto

La machine virtuelle Java a besoin de mémoire contiguë et selon quoi d’autre est en cours d’exécution, ce qui fonctionnait avant et comment windows gère la mémoire, vous pouvez être en mesure d’obtenir jusqu'à 1,4 GB de mémoire contiguë. Je pense que Windows 64 bits permettra aux plus gros tas.

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