J'ai lire la taille maximale du tas sur Windows 32 bits est de ~ 1,5 Go, ce qui est dû au fait que la JVM nécessite une mémoire contiguë. Quelqu'un peut-il expliquer le concept de "mémoire contiguë" et pourquoi vous ne disposez que de 1,5 Go maximum sous Windows?
Deuxièmement, quelle est alors la taille maximale du tas sur Windows 64 bits et pourquoi est-ce différent de ce qui est disponible sur 32 bits?
La partie 32 bits/64 bits n'est pas liée à Java
Il s'avère que les emplacements de mémoire dans un système 32 bits sont référencés par des entiers non signés 32 bits. Cela permet jusqu'à 2 ^ 32 emplacements de mémoire possibles. Étant donné que chaque emplacement stocke 1 octet, vous obtenez 2 ^ 32 octets ou 4 Go si vous préférez.
Sur un système 64 bits, il existe 2 ^ 64 emplacements, soit 16 exaoctets.
Maintenant, dans Windows, la partie contiguë devient un gros problème, mais c'est exactement comme cela que Windows fait les choses. L'idée est que vous devez avoir une plage entière "ininterrompue" pour votre tas. Malheureusement, Windows alloue de la mémoire quelque part au milieu. Cela vous laisse essentiellement environ la moitié du côté gauche ou la moitié du côté droit, environ 1,5 à 2 Go de morceaux, pour allouer votre tas.
Consultez cette question pour plus de détails sur 32 vs 64 bits.
Edit: Merci mrjoltcola pour le préfixe exa!
Contigu signifie simplement "sans lacunes", un long segment unique. Le montant est limité par la taille d'un segment que le système d'exploitation peut mapper pour votre processus. Que Java nécessite ou non un segment contigu est un problème d'implémentation spécifique à la JVM et peut ne pas exister pour les autres VM.
La mémoire contiguë n'est pas le problème limitant les fenêtres à utiliser seulement 1,2 Go de tas. Même si le segment min/max est défini, la JVM occuperait le segment max de la mémoire système lors du démarrage. Il ne référencera alors que le segment min dans la mémoire système occupée jusqu'à ce qu'il doive se développer. La mémoire contiguë du tas max est requise pour démarrer la JVM dans la plupart des implémentations afin d'améliorer les performances.
Comme Marcus l'a expliqué ci-dessus, la limite de matériel 32 bits est de 4 Go pour un seul processus (thread). Chaque système d'exploitation traite différemment ces 4 Go. 4 Go est principalement divisé en espace noyau et espace utilisateur. Dans les fenêtres 32 bits, l'espace utilisateur maximal est proche de 1,5 Go. Il est possible de démarrer Windows avec le commutateur/3GB pour avoir plus d'espace utilisateur.