In 64-Bit-Windows 7 mit einer großen Heap-Größe kann keine 64-Bit-JVM ausgeführt werden

8

Dies ist 64-Bit Windows 7 Enterprise und 64-bit Java 7:

%Vor%

Dies geschieht mit einer Shell von C:\Windows\SystemWOW64\cmd.exe (die ich fälschlicherweise für die 64-Bit-Version hielt) und mit C:\Windows\System32\cmd.exe (was ich gerade mit freundlicher Genehmigung von Pulsar herausgefunden habe) eine 64-Bit-Anwendung trotz des Pfadnamens).

Das Programm selbst ist trivial:

%Vor%

Ich habe nur mit verschiedenen -Xmx und -Xms Argumenten rumgespielt, um zu sehen, was passieren würde. Ich hätte zwar mit 64-Bit-Java auf 64-Bit-Windows, dass ich so ziemlich jede Größe Max und Initial-Heap verwenden könnte, die ich wollte, aber das ist nicht, was passiert.

java -Xmx16G -Xms2G Trivial (zum Beispiel) funktioniert gut. % Co_de% gibt mir jedoch:

%Vor%

Weider (für mich), java -Xmx16G -Xms4G Trivial gibt einen anderen Fehler:

%Vor%

Ich versuche, die Differenz zwischen java -Xmx16G -Xms3G Trivial und 2G zu teilen, um zu sehen, ob es eine bestimmte Größe gab, wo das passierte. Ich probierte 3G und es funktionierte. Dann habe ich java -Xmx16G -Xms2900M Trivial ausprobiert und es hat funktioniert. Mit -Xms2960M ist die JVM abgestürzt:

%Vor%

Das ging bis -Xms2970m weiter, als es wieder auf die Meldung "Tabellen für die parallele Speicherbereinigung nicht zuordnen" umgestellt wurde und bei dieser als -Xms2995M beibehalten wurde.

Was könnte passieren? Wird durch das Starten von -Xms (sogar ein 64-Bit-Wert) eine Beschränkung der Prozessgröße auferlegt? Benötigt Windows (oder die JVM) einen einzelnen großen Speicherblock? (Aber warum dann die verschiedenen Nachrichten)? Etwas anderes?

    
QuantumMechanic 04.06.2012, 22:08
quelle

2 Antworten

3

In einem 64-Bit-System haben Sie 2 ^ 63Bytes der Benutzeradresse space , aber Sie können immernoch nur den tatsächlich vorhandenen Speicher zuordnen (physisch + Seitendatei + gemappte Dateien).

Wenn die JVM den Heap erstellt, verwendet sie C malloc() , um einen ersten Teil des Speichers anzufordern, und dann wird sie den Teil selbst verwalten . Selbst wenn Sie überhaupt kein Objekt auf dem Heap haben, wird das Chunk für das Betriebssystem verwendet.

Da Sie -Xms angegeben haben, was der Mindestwert des Speicherpools ist, versucht die JVM einfach, diese Speichermenge vom Betriebssystem zu verlangen, oder sie schlägt fehl, da sie Ihren Befehl nicht erfüllen kann.

Ich denke, wenn Sie den Vorteil von 64-Bit-Java sehen wollen. Vielleicht können Sie versuchen, eine Datei mit mehr als 4 GB für den wahlfreien Zugriff zu öffnen und sie einem MappedByteBuffer zuzuordnen.

    
billc.cn 05.06.2012, 00:27
quelle
5

SysWoW64 bezieht sich auf die 32bit Windows on Windows 64 . Vereinfacht: 32-Bit-Windows läuft unter Windows 64bit).

Sie fordern also explizit die Ausführung in einer 32-Bit-cmd-Shell an.

Siehe:

Ссылка

    
quelle