Questo è a 64 bit Windows 7 Enterprise
e 64 bit Java 7:non è possibile eseguire una JVM a 64 bit a 64 bit di Windows 7 con una grande dimensione heap
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)
Ciò avviene utilizzando un guscio di entrambi C:\Windows\SystemWOW64\cmd.exe
(che ho erroneamente pensato fosse la versione a 64 bit) e con C:\Windows\System32\cmd.exe
(che ho appena scoperto, per gentile concessione di Pulsar, è un'applicazione a 64 bit nonostante il nome del percorso).
Il programma stesso è banale:
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);
}
}
Stavo solo scherzare con diversi -Xmx
e -Xms
argomenti per vedere cosa sarebbe successo. Avrei pensato che con Java a 64 bit su Windows a 64 bit avrei potuto usare praticamente qualsiasi dimensione massima e heap iniziale che volevo, ma non è quello che sta succedendo.
java -Xmx16G -Xms2G Trivial
(ad esempio) funziona correttamente.
Error occurred during initialization of VM
Could not reserve enough space for object heap
Weirder (a me), java -Xmx16G -Xms3G Trivial
dà un errore diverso::
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.
Il tentativo di dividere la differenza tra 2G
e 3G
per vedere se ci fosse una dimensione specifica in cui, tuttavia, java -Xmx16G -Xms4G Trivial
mi dà questo è successo ho provato java -Xmx16G -Xms2900M Trivial
e ha funzionato. Poi ho provato -Xms2960M
e ha funzionato. Con -Xms2970m
JVM è precipitato:
#
# 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
Questo è continuato fino -Xms2995M
quando si accende di nuovo al "grado di allocare le tabelle per la raccolta dei rifiuti parallelo" messaggio e bloccato con che, come -Xms
è stato aumentato ulteriormente.
Cosa potrebbe succedere? Il lancio di qualcosa da cmd.exe
(anche uno a 64 bit) impone alcuni limiti di dimensioni del processo? Windows (o la JVM) richiede un unico enorme blocco di memoria? (Ma allora perché i diversi messaggi)? Qualcos'altro?
Un possibile limite di spazio di scambio. Non ci avevo pensato. Quando torno al lavoro domani controllerò le impostazioni della dimensione del file di paging su quel computer e vedremo a cosa è impostato. – QuantumMechanic
It ** was ** swap size. Anziché essere gestito automaticamente, per qualche motivo il file di paging sul computer che stavo utilizzando era impostato su una dimensione costante di 4 GB. La RAM del computer era di 8 GB, quindi nella migliore delle ipotesi c'erano 12 GB di memoria virtuale, e naturalmente c'erano un sacco di altri programmi in esecuzione. Quando ho aumentato la dimensione del file di paging ho potuto ottenere un valore '-Xms' molto più alto. – QuantumMechanic