2012-06-04 12 views
8

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?

risposta

3

In un sistema a 64 bit, si dispone di 2^63Bytes di indirizzo dell'utente spazio, ma è ancora possibile mappare solo la quantità di memoria effettiva si dispone (fisica + file di paging + file mappati).

Quando la JVM crea l'heap, che sta utilizzando C malloc() per richiedere un pezzo iniziale di memoria e quindi sta andando a gestire il pezzo da solo. Anche se non si dispone di alcun oggetto sull'heap, al sistema operativo viene utilizzato il blocco.

Poiché è stato specificato -Xms, che è il valore minimo del pool di memoria, la JVM cercherà semplicemente di richiedere quella quantità di memoria dal sistema operativo o avrà esito negativo in quanto non può soddisfare il comando.

Immagino se vuoi vedere il vantaggio di Java a 64 bit. Forse puoi provare ad aprire un file più grande di 4 GB per l'accesso casuale e mapparlo a un MappedByteBuffer.

+0

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

+3

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

5

SysWoW64 fa riferimento a 32 bit Windows on Windows 64. Semplificato: finestre a 32 bit in esecuzione su Windows 64 bit).

Così si sono esplicitamente la richiesta per l'esecuzione in un 32bit cmd shell.

Si veda:

http://en.wikipedia.org/wiki/WoW64

+0

Grazie per le informazioni. Non ho mai saputo che '\ Windows \ System32' contiene applicazioni a 64 bit. Tuttavia, non è questo il problema: la stessa cosa accade quando uso 'C: \ Windows \ System32 \ cmd.exe'. – QuantumMechanic

Problemi correlati