2010-03-16 12 views
33

Ho read la dimensione massima dell'heap su 32 bit Windows è ~ 1,5 GB, dovuto al fatto che la JVM richiede memoria contigua. Qualcuno può spiegare il concetto di "memoria contigua" e perché hai solo un massimo di 1,5 GB su Windows?Capire le dimensioni massime dell'heap JVM - 32 bit contro 64 bit

In secondo luogo, qual è la dimensione massima dell'heap su Windows a 64 bit e perché è diversa da quella disponibile su 32 bit?

+2

Il limite per qualsiasi jvm a 32 bit su un sistema operativo a 32 bit varia da circa 1,2 GB (alcune versioni di Windows) a 2,0 GB (Solaris). Jvm a 32 bit su Solaris a 64 bit può ottenere 4 GB. Penso che il massimo jvm a 64 bit su Windows a 64 bit sia 32 GB. – Seth

+0

Mi sarei aspettato una JVM a 32 bit su un Win7 a 64 bit per essere in grado di ottenere anche 4GB - ma non è così - sono ancora 1.5GB ... (JDK5) – zb226

risposta

35

La parte 32 bit/64-bit è correlato a Java

Risulta che posizioni di memoria in un sistema a 32 bit fanno riferimento a 32 bit interi senza segno. Ciò consente fino a 2^32 possibili posizioni di memoria. Poiché ogni posizione memorizza 1 byte ottieni 2^32 byte o 4 GB se preferisci.

Su un sistema a 64 bit ci sono 2^64 posizioni o 16 exabyte.

Ora, in Windows, la parte contigua diventa un grosso problema, ma è proprio così che Windows fa le cose. L'idea è che devi avere un intero intervallo "ininterrotto" per il tuo heap. Tristemente, Windows assegna un po 'di memoria da qualche parte nel mezzo. Questo in pratica ti lascia circa la metà del lato sinistro o metà del lato destro, circa 1,5-2GB pezzi, per allocare il tuo heap.

Verificare this question per ulteriori dettagli su 32 vs 64 bit.

Modifica: Grazie a mrjoltcola per il prefisso exa!

+0

exa arriva dopo peta;) I è un po 'implicito già, ma penso che valga la pena sottolineare che, poiché lo spazio degli indirizzi è così grande, è più facile trovare un blocco contiguo più ampio di spazio degli indirizzi disponibile - ecco perché è possibile specificare una dimensione heap molto più grande su un sistema operativo a 64 bit . – rob

+0

Vale anche la pena notare che per la memoria, un Exabyte è 1024^6 byte e un Exabyte di memoria è 1000^6 byte. Quindi 2^64 è 16 Exabyte di memoria e 18,4 Exabyte di memoria. ;) –

6

Contiguo significa semplicemente "senza spazi vuoti", un segmento singolo lungo. L'importo è limitato dalla larghezza di un segmento che il sistema operativo può mappare per il processo. Se Java richiede un heap contiguo o meno è un problema di implementazione specifico per JVM e potrebbe non esistere per altre macchine virtuali.

4

La memoria contigua non è il problema che limita Windows a utilizzare solo 1,2 GB di heap. Anche se l'heap min/max è stato definito, JVM occupa l'heap massimo dalla memoria di sistema durante l'avvio. Quindi farà riferimento solo al min heap nella memoria di sistema occupata fino a quando non ha dovuto espandersi. La memoria contigua dell'heap massimo è necessaria per avviare JVM nella maggior parte degli impianti per migliorare le prestazioni.

Come spiegato sopra Marcus, il limite dell'hardware a 32 bit è 4 GB per un singolo processo (thread). Ogni sistema operativo si rivolge a questo 4 GB in modo diverso. I 4 GB vengono suddivisi in modo significativo come spazio del kernel e spazio utente. Nelle finestre a 32 bit lo spazio utente massimo è vicino a 1,5 GB. C'è un'opzione per avviare Windows con/3GB per avere più spazio utente.

Problemi correlati