Ne peut pas exécuter une JVM 64 bits et 64 bits de Windows 7 avec une grande taille de segment de mémoire
C'est 64-bit Windows 7 Enterprise
et 64 bits de Java 7:
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
Ce qui se passe à l'aide d'une coquille de deux C:\Windows\SystemWOW64\cmd.exe
(que j'ai mal pensé était la version 64 bits) et avec C:\Windows\System32\cmd.exe
(que j'ai découvert, avec l'aimable autorisation de Pulsar, est une application 64 bits, malgré le nom de chemin d'accès).
Le programme lui-même est trivial:
public class Trivial
{
public static void main(String[] args) {
System.out.println("total = " + toMB(Runtime.getRuntime().totalMemory()));
System.out.println("max = " + toMB(Runtime.getRuntime().maxMemory()));
}
private static long toMB(long bytes) {
return bytes / (1024L * 1024L);
}
}
J'étais juste dupant autour avec différents -Xmx
et -Xms
arguments pour voir ce qui allait se passer. J'aurais cependant qu'avec la version 64 bits de Java 64 bits de Windows je pourrais utiliser à peu près n'importe quelle taille max, et initiale du tas que je voulais, mais ce n'est pas ce qui se passe.
java -Xmx16G -Xms2G Trivial
(par exemple) fonctionne très bien. Cependant, java -Xmx16G -Xms4G Trivial
me donne:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Plus étrange (pour moi), java -Xmx16G -Xms3G Trivial
donne une autre erreur:
Error occurred during initialization of VM
Unable to allocate tables for parallel garbage collection for the requested heap size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Tenté de diviser la différence entre 2G
et 3G
pour voir si il y avait une taille spécifique où cela est arrivé, j'ai essayé java -Xmx16G -Xms2900M Trivial
et cela a fonctionné. Ensuite, j'ai essayé -Xms2960M
et cela a fonctionné. Avec -Xms2970m
la JVM s'est écrasé:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1048576 bytes for E in C:\jdk7u2_64p\jdk7u4\hotspot\src\share\vm\utilities/taskqueue.hpp
# An error report file with more information is saved as:
# C:\Users\QuantumMechanic\Temp\hs_err_pid10780.log
Qui a continué jusqu'à -Xms2995M
quand il est passé de retour à la "impossible d'allouer des tableaux parallèlement à la collecte des ordures" message et coincé avec ce que -Xms
a encore augmenté.
Ce qui pourrait se passer? Ne lancer quelque chose de cmd.exe
(même un 64-bit) imposent un processus de limite de taille? Est de Windows (ou de la JVM) nécessitant une seule énorme bloc de mémoire? (Mais alors, pourquoi les différents messages)? Quelque chose d'autre?
OriginalL'auteur QuantumMechanic | 2012-06-04
Vous devez vous connecter pour publier un commentaire.
Dans un système 64 bits, vous avez 2^63Bytes de l'utilisateur, l'adresse de espace, mais vous pouvez toujours la carte de la quantité de mémoire dont vous disposez (physique + fichier de page + des fichiers mappés).
Lorsque la JVM crée le tas, c'est à l'aide de C
malloc()
à la demande d'une première partie de la mémoire, puis il va gérer la partie par lui-même. Même si vous n'avez pas n'importe quel objet sur le tas, à l'OS le bloc est utilisé.Depuis que vous avez spécifié
-Xms
, qui est la valeur minimale de la mémoire de la piscine, la JVM va simplement essayer d'exiger que la quantité de mémoire à partir de l'OS ou de l'échec comme il ne peut pas satisfaire votre commande.Je suppose que si vous voulez voir l'avantage du 64 bits de Java. Peut-être que vous pouvez essayer d'ouvrir un fichier de plus de 4GO pour un accès aléatoire et de l'associer à un MappedByteBuffer.
a swap de la taille. Plutôt que d'être auto-administré, pour une raison quelconque, le fichier d'échange sur l'ordinateur que j'utilisais était définie à une constante de la taille de 4 go. La RAM de l'ordinateur a été de 8 go, donc au mieux, il y a 12 go de mémoire virtuelle, et bien sûr, il y avait tout un tas d'autres programmes en cours d'exécution. Quand j'ai augmenté la taille de fichier d'échange, j'ai pu avoir beaucoup plus de
-Xms
valeur.OriginalL'auteur billc.cn
SysWoW64 se réfère à la 32bit
Windows on Windows 64
. Simplifié: 32 bits de windows en cours d'exécution sur windows 64 bits).Donc, vous êtes en demandant explicitement à exécuter dans un 32bit cmd shell.
Voir:
http://en.wikipedia.org/wiki/WoW64
\Windows\System32
détient les applications 64 bits. Cependant, ce n'est pas le problème, la même chose arrive quand j'utiliseC:\Windows\System32\cmd.exe
.OriginalL'auteur Mattias Isegran Bergander