Java mémoire maximale sous Windows XP


J'ai toujours été en mesure d'allouer 1400 mégaoctets pour Java SE fonctionnant 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 en utilisant Java 1.5_16 et 1.6.0_07 et j'ai eu 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 plus que je puisse allouer sur cette machine.

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

Edit: La machine a 4 Go de RAM avec environ 3,5 Go que Windows peut reconnaître.

Author: Steve Kuo, 2008-10-05

12 answers

Gardez à l'esprit que Windows a une gestion de la mémoire virtuelle et que la JVM n'a besoin que de 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 va vous gêner, ce sont les DLL qui sont chargées dans votre espace d'adressage. Malheureusement, les optimisations dans Windows qui minimisent la relocalisation des DLL lors de la liaison rendent plus probable que vous aurez un espace d'adressage fragmenté. Les choses qui sont susceptibles de réduire votre espace d'adressage en dehors des choses habituelles comprennent les logiciels de sécurité, les logiciels CBT, les logiciels espions et autres formes de logiciels malveillants. Les causes probables des variances sont différents correctifs de sécurité, versions d'exécution C, etc. Les pilotes de périphériques et autres bits du noyau ont leur propre espace d'adressage (les 2 Go restants de l'espace 32 Bits de 4 Go).

Vouspourriez essayer de parcourir vos liaisons DLL dans votre processus JVM et essayer de rebaser vos DLL dans un espace d'adressage plus compact. Pas de plaisir, mais si vous êtes désespérés...

Alternativement, vous pouvez simplement passer à Windows 64 bits et à une JVM 64 bits. Malgré ce que d'autres ont suggéré, alors qu'il va mâcher plus de RAM, vous aurez beaucoup plus d'espace d'adressage virtuel contigu, et allouer 2 Go contigueusement serait trivial.

 118
Author: Christopher Smith, 2009-01-31 00:02:39

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

Voici quelques informations que j'ai trouvées en ligne pour quelqu'un qui le demandait auparavant, soi-disant d'un "dieu VM":

La raison pour laquelle nous avons besoin d'une mémoire contiguë région pour le tas est que nous avons un tas de structures de données latérales qui sont indexé par des compensations (mises à l'échelle) du début de la tas. Par exemple, nous suivre les mises à jour de référence d'objet avec un "tableau de marque de carte" qui a un octet pour chaque 512 octets de mémoire. Lorsque nous stocker une référence dans le tas que nous avons pour marquer l'octet correspondant à la carte de marque de tableau. Nous décalons à droite le adresse de destination du magasin et utilisez-le pour indexer le tableau de marques de carte. Fun adressage arithmétique jeux vous ne peut pas faire en Java que vous obtenez (avoir pour :-) jouer en C++.

Habituellement, nous n'avons pas de mal à obtenir régions contiguës modestes (jusqu'à environ 1,5 Go sur Windohs, jusqu'à environ 3,8 Go sur Solaris. YMMV.). Sur Windohs, le le problème est surtout qu'il y a quelque bibliothèques qui sont chargées avant le JVM démarre qui rompt le adresse de l'espace. Utilisation du commutateur /3GB ne rebase pas ces bibliothèques, donc ils sont toujours un problème pour nous.

Nous savons faire des tas de morceaux, mais il y aurait des frais généraux à utiliser ils. Nous avons plus de demandes pour plus rapide gestion du stockage que nous faisons pour des tas plus grands dans la JVM 32 bits. Si vous vraiment envie de grands tas, passer à la La JVM 64 bits. Nous avons encore besoin contigus de mémoire, mais c'est beaucoup plus facile à obtenir dans un espace d'adressage 64 bits.

 49
Author: Uri, 2009-01-31 01:26:14

Les limites de taille de tas Java pour Windows sont:

  • maximum taille de tas possible sur Java 32 bits: 1,8 Go
  • recommandé limite de taille de tas sur Java 32 bits: 1,5 Go (ou 1,8 Go avec l'option /3 Go)

Cela ne vous aide pas à obtenir un tas Java plus grand, mais maintenant vous savez que vous ne pouvez pas aller au-delà de ces valeurs.

 19
Author: MicSim, 2015-09-22 07:10:05

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.

 10
Author: Kire Haglin, 2009-02-06 00:58:46

La JVM a besoin de mémoire contiguë et en fonction de ce qui est en cours d'exécution, de ce qui s'exécutait 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 les fenêtres 64 bits permettront des tas plus grands.

 6
Author: James A. N. Stauffer, 2008-10-05 04:26:43

La JVM de Sun a besoin de mémoire contiguë. La quantité maximale de mémoire disponible est donc 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. Ainsi, votre matériel et ses pilotes déterminent la quantité de mémoire que vous pouvez obtenir.

Deux sources pour cela, avec des déclarations de Soleil ingénieurs: forum blog

Peut-être une autre JVM? Avez-vous essayé Harmony? Je pense qu'ils ont prévu de permettre mémoire non continue.

 6
Author: the.duckman, 2008-10-06 19:59:41

Je pense que cela a plus à voir avec la façon dont Windows est configuré comme indiqué par cette réponse: Java Option-Xmx

Encore quelques tests: j'ai pu allouer 1300 Mo sur une ancienne machine Windows XP avec seulement 768 Mo de RAM physique (plus de la mémoire virtuelle). Sur ma machine RAM 2GB, je ne peux obtenir que 1220MB. 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 (juste achetée chez Dell), alors peut-être qu'elle a plus récente (et plus encore bloated) Windows et DLL (il exécute Windows XP Pro Version 2002 SP2).

 3
Author: Steve Kuo, 2008-10-05 23:48:23

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 un petit montant 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 le questionneur.

 2
Author: William Denniss, 2011-04-07 02:38:34

Le JDK/JRE de Sun a besoin d'une quantité de mémoire contiguë si vous allouez un bloc énorme.

Le système d'exploitation et les applications initiales ont tendance à allouer des bits et des morceaux pendant le 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.

 1
Author: anjanb, 2008-10-05 05:09:02

Tout le monde semble répondre à propos de la mémoire contiguë, mais a négligé de reconnaître un problème plus urgent.

Même avec une allocation de mémoire contiguë à 100%, vous ne pouvez pas avoir une taille de tas de 2 Go sur un système d'exploitation Windows 32 bits (*par défaut). En effet, les processus Windows 32 bits ne peuvent pas traiter plus de 2 Go d'espace.

Le processus Java contiendra perm gen (pre Java 8), la taille de la pile par thread, la surcharge JVM / bibliothèque (qui augmente à peu près à chaque build) all in ajout au 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:

 java -XX:+PrintFlagsFinal

De nombreuses options affectent la division de la mémoire dans et hors du tas. Vous laissant avec plus ou moins de ce 2 GiB pour jouer avec...

Pour réutiliser des parties de cette réponse (à propos de Tomcat, mais s'applique à tout processus Java):

Le SYSTÈME D'EXPLOITATION Windows limite l'allocation de mémoire d'un 32 bits processus à 2 GiO au total (par défaut).

[Vous ne pourrez allouer qu'environ 1,5 Gio de tas espace car il y a aussi une autre mémoire allouée au processus (la surcharge de la JVM / bibliothèque,l'espace de génération de perm, etc.).

Pourquoi Windows 32 bits impose-t-il une limite d'espace d'adressage de processus de 2 Go, mais Windows 64 bits impose une limite de 4 Go?

D'autres systèmes d'exploitation modernes [cough Linux] permettent aux processus 32 bits de utilisez tout (ou la plupart) des 4 GiO l'espace adressable.

Cela dit, les systèmes d'exploitation Windows 64 bits peuvent être configurés pour augmenter la limite des processus 32 bits à 4 GiO (3 GiO sur 32 bits):

Http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs. 85).aspx

 1
Author: Mikaveli, 2017-05-23 12:09:46

Voici comment augmenter la taille de pagination

  1. clic droit sur mycomputer - - - > propriétés - - - >Avancé
  2. dans la section performances, cliquez sur paramètres
  3. cliquez sur l'onglet Avancé
  4. dans la section mémoire Virtuelle, cliquez sur modifier. Il montrera ur pagination actuelle taille.
  5. Sélectionnez le lecteur où l'espace disque dur est disponible.
  6. Fournir la taille initiale et la taille maximale ...par exemple taille initiale 0 Mo et taille maximale 4000 Mo. (Autant que vous aurez besoin)
 0
Author: Israel Margulies, 2012-12-17 21:25:44

Tout d'abord, utiliser un fichier-page 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), donc le fichier de page n'est pas utilisé.

Deuxièmement, l'espace d'adressage est divisé en 2, la moitié pour le noyau, la moitié pour le mode utilisateur. Si vous avez besoin de plus de RAM pour vos applications, utilisez l'option /3GB au démarrage.ini (assurez-vous 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 d'espace d'adressage parce que java gaspille de la mémoire en interne (pour les threads, le compilateur JIT, l'initialisation de la machine virtuelle, etc.). Utilisez le commutateur / 3GB pour plus.

 -1
Author: user17544, 2009-02-02 23:12:22