Memoria massima Java su Windows XP


Sono sempre stato in grado di allocare 1400 megabyte per Java SE in esecuzione su Windows XP a 32 bit (Java 1.4, 1.5 e 1.6).

java -Xmx1400m ...

Oggi ho provato la stessa opzione su una nuova macchina Windows XP usando Java 1.5_16 e 1.6.0_07 e ho ottenuto l'errore:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Attraverso tentativi ed errori sembra che 1200 megabyte siano il massimo che posso allocare su questa macchina.

Qualche idea sul perché una macchina consentirebbe 1400 e un'altra solo 1200?

Modifica: La macchina ha 4 GB di RAM con circa 3,5 GB che Windows può riconoscere.

Author: Steve Kuo, 2008-10-05

12 answers

Tieni presente che Windows ha la gestione della memoria virtuale e la JVM ha solo bisogno di memoria contigua nel suo spazio di indirizzi . Quindi, altri programmi in esecuzione sul sistema non dovrebbero necessariamente influire sulle dimensioni dell'heap. Ciò che ti ostacolerà sono le DLL che vengono caricate nel tuo spazio di indirizzi. Sfortunatamente le ottimizzazioni in Windows che riducono al minimo il trasferimento delle DLL durante il collegamento rendono più probabile che tu abbia uno spazio di indirizzi frammentato. Cose che rischiano di tagliare a il tuo spazio di indirizzo a parte le solite cose includono software di sicurezza, software CBT, spyware e altre forme di malware. Le cause probabili delle varianze sono diverse patch di sicurezza, versioni di runtime C,ecc. I driver di periferica e altri bit del kernel hanno il proprio spazio di indirizzamento (gli altri 2 GB dello spazio a 32 bit di 4 GB).

Tu potresti provare a passare attraverso i collegamenti DLL nel processo JVM e cercare di rebase delle DLL in uno spazio di indirizzi più compatto. Non è divertente, ma se sei disperato...

In alternativa, puoi semplicemente passare a Windows a 64 bit e una JVM a 64 bit. Nonostante ciò che altri hanno suggerito, mentre masticherà più RAM, avrai molto più spazio di indirizzi virtuali contigui e allocare 2 GB contigui sarebbe banale.

 118
Author: Christopher Smith, 2009-01-31 00:02:39

Questo ha a che fare con la memoria contigua.

Ecco alcune informazioni che ho trovato online per qualcuno che lo chiedeva prima, presumibilmente da un"dio VM":

La ragione per cui abbiamo bisogno di una memoria contigua la regione per l'heap è che abbiamo un gruppo di strutture di dati laterali che sono indicizzato da offset (scalati) dal inizio del mucchio. Ad esempio, noi traccia gli aggiornamenti di riferimento agli oggetti con un "matrice del segno della carta" che ha un byte per ogni 512 byte di heap. Quando noi memorizzare un riferimento nel mucchio che abbiamo per contrassegnare il byte corrispondente nel matrice del segno della carta. Abbiamo destra spostare il indirizzo di destinazione del negozio e usalo per indicizzare l'array di segni della carta. Divertente affrontare giochi aritmetici si non può fare in Java che si arriva a (avere a: -) gioca in C++.

Di solito non abbiamo problemi a ottenere regioni contigue modeste (fino a circa 1.5 GB su Windohs, fino a circa 3.8 GB su Solaris. YMMV.). Su Windohs, il il problema è soprattutto che ci sono alcuni librerie che vengono caricate prima del JVM si avvia che rompono il spazio indirizzi. Utilizzando il / 3 GB interruttore non rebase quelle librerie, quindi sono ancora un problema per noi.

Sappiamo come fare cumuli chunked, ma ci sarebbe un po ' di overhead per l'utilizzo loro. Abbiamo più richieste per più veloce gestione dello storage di quanto facciamo per cumuli più grandi nella JVM a 32 bit. Se tu vuole davvero grandi cumuli, passare al JVM a 64 bit. Abbiamo ancora bisogno di contigui memoria, ma è molto più facile entrare uno spazio di indirizzi a 64 bit.

 49
Author: Uri, 2009-01-31 01:26:14

I limiti di dimensione dell'heap Java per Windows sono:

  • massima dimensione heap possibile su Java a 32 bit: 1,8 GB
  • consigliato limite di dimensione dell'heap su Java a 32 bit: 1,5 GB (o 1,8 GB con opzione /3 GB)

Questo non ti aiuta a ottenere un heap Java più grande, ma ora sai che non puoi andare oltre questi valori.

 19
Author: MicSim, 2015-09-22 07:10:05

Oracle JRockit, che può gestire un heap non contiguo, può avere una dimensione heap Java di 2,85 GB su Windows 2003/XP con lo switch /3GB. Sembra che la frammentazione possa avere un impatto notevole sulla dimensione di un heap Java.

 10
Author: Kire Haglin, 2009-02-06 00:58:46

La JVM ha bisogno di memoria contigua e, a seconda di cos'altro è in esecuzione, di cosa era in esecuzione prima e di come Windows ha gestito la memoria, potresti essere in grado di ottenere fino a 1,4 GB di memoria contigua. Penso che Windows a 64 bit consentirà cumuli più grandi.

 6
Author: James A. N. Stauffer, 2008-10-05 04:26:43

La JVM di Sun ha bisogno di memoria contigua. Quindi la quantità massima di memoria disponibile è dettata dalla frammentazione della memoria. Soprattutto le dll del driver tendono a frammentare la memoria, quando si carica in un indirizzo di base predefinito. Quindi il tuo hardware e i suoi driver determinano quanta memoria puoi ottenere.

Due fonti per questo con dichiarazioni da ingegneri Sun: forum blog

Forse un'altra JVM? Hai provato Harmony ? Penso che abbiano pianificato di consentire memoria non continua.

 6
Author: the.duckman, 2008-10-06 19:59:41

Penso che abbia più a che fare con il modo in cui Windows è configurato come suggerito da questa risposta: Opzione Java-Xmx

Qualche altro test: sono stato in grado di allocare 1300 MB su una vecchia macchina Windows XP con solo 768 MB di RAM fisica (più memoria virtuale). Sulla mia macchina 2GB RAM posso ottenere solo 1220MB. Su varie altre macchine aziendali (con Windows XP precedente) sono stato in grado di ottenere 1400 MB. La macchina con un limite di 1220 MB è piuttosto nuova (appena acquistata da Dell), quindi forse ha più recente (e altro ancora gonfio) Windows e DLL (è in esecuzione Windows XP Pro Versione 2002 SP2).

 3
Author: Steve Kuo, 2008-10-05 23:48:23

Ho ricevuto questo messaggio di errore durante l'esecuzione di un programma java da un virtuozzo VPS (memoria limitata). Non avevo specificato alcun argomento di memoria e ho scoperto che dovevo impostare esplicitamente un importo piccolo poiché il valore predefinito doveva essere troppo alto. Ad esempio-Xmx32m (ovviamente deve essere sintonizzato a seconda del programma che si esegue).

Basta metterlo qui nel caso in cui qualcun altro ottenga il messaggio di errore sopra senza specificare una grande quantità di memoria come ha fatto l'interrogante.

 2
Author: William Denniss, 2011-04-07 02:38:34

Il JDK/JRE di Sun ha bisogno di una quantità di memoria contigua se si alloca un blocco enorme.

Il sistema operativo e le app iniziali tendono ad allocare bit e pezzi durante il caricamento che frammentano la RAM disponibile. Se un blocco contiguo NON è disponibile, SUN JDK non può utilizzarlo. JRockit di Bea (acquisito da Oracle) può allocare memoria da pezzi.

 1
Author: anjanb, 2008-10-05 05:09:02

Tutti sembrano rispondere sulla memoria contigua, ma hanno trascurato di riconoscere un problema più urgente.

Anche con allocazione di memoria contigua al 100%, non è possibile avere una dimensione heap a 2 GiB su un sistema operativo Windows a 32 bit (*per impostazione predefinita). Questo perché i processi Windows a 32 bit non possono indirizzare più di 2 GiB di spazio.

Il processo Java conterrà perm gen (pre Java 8), dimensione dello stack per thread, overhead JVM / library (che aumenta praticamente con ogni build) tutto in aggiunta all'heap .

Inoltre, i flag JVM e i loro valori predefiniti cambiano tra le versioni. Basta eseguire quanto segue e avrai qualche idea:

 java -XX:+PrintFlagsFinal

Molte delle opzioni influenzano la divisione della memoria dentro e fuori dall'heap. Lasciandoti con più o meno di quel 2 GiB con cui giocare...

Per riutilizzare porzioni di questa mia risposta (su Tomcat, ma si applica a qualsiasi processo Java):

Il sistema operativo Windows limita l'allocazione della memoria di un 32-bit processo a 2 GiB in totale (da predefinito).

[Sarai solo in grado] di allocare circa 1,5 GiB heap spazio perché c'è anche altra memoria allocata al processo (l'overhead JVM / library, lo spazio perm gen ecc.).

Perché Windows a 32 bit impone un limite di spazio per gli indirizzi di processo di 2 GB, ma Windows a 64 bit impone un limite di 4 GB?

Altri sistemi operativi moderni [cough Linux] consentono ai processi a 32 bit di utilizzare tutti (o la maggior parte) dei 4 GiB spazio indirizzabile.

Detto questo, i sistemi operativi Windows a 64 bit possono essere configurati per aumentare il limite di processi a 32 bit a 4 GiB (3 GiB su 32 bit):

Http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778 (v=vs. 85).aspx

 1
Author: Mikaveli, 2017-05-23 12:09:46

Ecco come aumentare la dimensione del paging

  1. fare clic destro su mycomputer--->proprietà - - - >Avanzate
  2. nella sezione Prestazioni fare clic su Impostazioni
  3. fare clic sulla scheda Avanzate
  4. nella sezione Memoria virtuale, fare clic su Modifica. Mostrerà ur corrente di paging dimensione.
  5. Selezionare l'unità in cui è disponibile spazio su HDD.
  6. Fornire la dimensione iniziale e la dimensione massima ...ad esempio dimensione iniziale 0 MB e dimensione massima 4000 MB. (Per quanto si richiede)
 0
Author: Israel Margulies, 2012-12-17 21:25:44

In primo luogo, l'utilizzo di un file di pagina quando si dispone di 4 GB di RAM è inutile. Windows non può accedere a più di 4 GB (in realtà, meno a causa di buchi di memoria) quindi il file di paging non viene utilizzato.

In secondo luogo, lo spazio degli indirizzi è diviso in 2, metà per il kernel, metà per la modalità utente. Se hai bisogno di più RAM per le tue applicazioni usa l'opzione /3GB all'avvio.ini (assicurarsi java.exe è contrassegnato come "large address aware" (google per maggiori informazioni).

In terzo luogo, penso che non sia possibile allocare l'intero 2 GB di spazio indirizzi perché java spreca un po ' di memoria internamente (per thread, compilatore JIT, inizializzazione della VM, ecc.). Utilizzare l'interruttore /3GB per più.

 -1
Author: user17544, 2009-02-02 23:12:22